當共享數據被不同的線程存取,會出現數據不一致的情況。針對這種情況,Java有一個同步機制來解決這一個問題——鎖機制(synchronized關鍵字的使用),示例代碼如下:
public class ShareData {
static int data = 0;
// 定義了一個鎖對象lock
static final Object lock = new Object();
public static void main(String[] args) {
// TODO Auto-generated method stub
ShareThread1 st1 = new ShareThread1();
ShareThread2 st2 = new ShareThread2();
new Thread(st1).start();
new Thread(st2).start();
}
private static class ShareThread1 implements Runnable {
public void run() {
synchronized (lock) {
while (data < 10) {
try {
Thread.sleep(1000);
System.out.println("這個小於10的數據是:" + data++);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
private static class ShareThread2 implements Runnable {
public void run() {
synchronized (lock) {
while (data < 100) {
data++;
}
System.out.println("ShareThread2執行完之後data的值爲:"+data);
}
}
}
}
通俗理解就是當共享數據在某個線程中被鎖住之後,其他線程暫時不能操作共享數據,知道該線程執行完共享數據