Java並發程序設計(三) Java內存模型和線程安全
Java內存模型和線程安全
一 、原子性
原子性是指一個操作是不可中斷的。即使是在多個線程一起執行的時候,一個操作一旦開始,就不會被其它線程幹擾。
思考:i++是原子操作嗎?
二、有序性
Java代碼在執行使,並不一點會按照編寫程序的語義順序執行(為了優化性能)。具體不做解釋。
三、可見性
可見性是指一個線程修改了一個共享變量的值,其他線程能否立即知道這個修改。
編譯器優化
硬件優化(如寫吸收,批操作)
Java虛擬機層面的可見性
public class VisibilityTest extends Thread {
private boolean stop;
public void run() {
int i = 0;
while(!stop) {
i++;
}
System.out.println("finish loop,i=" + i);
}
public void stopIt() {
stop = true;
}
public boolean getStop(){
return stop;
}
public static void main(String[] args) throws Exception {
VisibilityTest v = new VisibilityTest();
v.start();
Thread.sleep(1000);
v.stopIt();
Thread.sleep(2000);
System.out.println("finish main");
System.out.println(v.getStop());
}
四、Happen-Before規則
程序順序原則:一個線程內保證語義的串行性
volatile規則:volatile變量的寫,先發生於讀,這保證了volatile變量的可見性
鎖規則:解鎖(unlock)必然發生在隨後的加鎖(lock)前
傳遞性:A先於B,B先於C,那麽A必然先於C
線程的start()方法先於它的每一個動作
線程的所有操作先於線程的終結(Thread.join())
線程的中斷(interrupt())先於被中斷線程的代碼
對象的構造函數執行結束先於finalize()方法
Java並發程序設計(三) Java內存模型和線程安全