1. 程式人生 > >Java並發程序設計(三) Java內存模型和線程安全

Java並發程序設計(三) Java內存模型和線程安全

-h static tar -a 順序 語義 ret public font

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內存模型和線程安全