深刻同步拜訪同享的可變數據剖析。本站提示廣大學習愛好者:(深刻同步拜訪同享的可變數據剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻同步拜訪同享的可變數據剖析正文
假如對同享的可變數據的拜訪不克不及同步,厥後果異常恐怖,即便這個變量是原子可讀寫的。
上面斟酌一個線程同步方面的成績。關於線程同步,Java類庫供給了Thread.stop的辦法,然則這個辦法其實不值得倡導,由於它實質上是不平安的。應用輪詢(Polling)的方法會更好,例以下面這段法式。
import java.util.concurrent.TimeUnit;
public class StopThread {
/**
* @param args
*/
private static boolean stopRequested;
public static void main(String[] args)
throws InterruptedException{
Thread backgroundThread = new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while(!stopRequested){
i++;
System.out.println(i);
}
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
你能夠會以為這個法式在運轉年夜約一秒後,因為主線程把stopRequested設成了true,使得後台的新線程停滯,其實否則,由於後台線程看不到這個值的變更,所以會一向無線輪回下去,這就是沒有對數據停止同步的效果。是以讓我們用同步的方法來完成這個義務。
import java.util.concurrent.TimeUnit;
public class StopThread {
/**
* @param args
*/
private static boolean stopRequested;
private static synchronized void requestStop(){
stopRequested = true;
}
private static synchronized boolean stopRequested(){
return stopRequested;
}
public static void main(String[] args)
throws InterruptedException{
Thread backgroundThread = new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while(!stopRequested()){
i++;
System.out.println(i);
}
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
requestStop();
}
}
如許就完成了數據的同步,值得留意的是,寫辦法(requestStop)和讀辦法(stopRequested)都須要被同步,不然依然不是真正意義上的同步。
別的,我們可使用volatile這個變量潤飾符來加倍簡略地完成同步義務。
import java.util.concurrent.TimeUnit;
public class StopThread {
/**
* @param args
*/
private static volatile boolean stopRequested;
public static void main(String[] args)
throws InterruptedException{
Thread backgroundThread = new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while(!stopRequested){
i++;
System.out.println(i);
}
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}