Java記憶體模型就是為了解決多執行緒環境下共享變數的一致性問題,一致性主要包含三大特性:原子性、可見性、有序性;
1.原子性
一段程式開始不會被其他執行緒打斷,可以是一個操作也可以是多個操作,通過了synchronized和Lock關鍵字來保證操作的原子性;
2.可見性
指當一個執行緒修改了共享變數的值,其它執行緒能立即感知到這種變化;volatile變數保證了多執行緒環境下變數的可見性,但不能保證原子操作;
除了volatile之外,還有兩個關鍵字也可以保證可見性,它們是synchronized和final;
所以可以看到synchronized即可以保證原子性也可以保證可見性;
3.有序性
Java程式中,如果在本執行緒中觀察,所有的操作都是有序的;如果在另一個執行緒觀察,所有的操作都是無序的。前半句指的是執行緒內表現為序列的語義,後半句指的是指令重排序和主記憶體和工作記憶體同步延遲的問題;
Java中提供了volatile和synchronized兩個關鍵字來保證有序性。
Java記憶體模型就是為了解決多執行緒環境下共享變數的一致性問題,一致性主要包含三大特性:原子性、可見性、有序性;
1.原子性
一段程式開始不會被其他執行緒打斷,可以是一個操作也可以是多個操作,通過了synchronized和Lock關鍵字來保證操作的原子性;
2.可見性
指當一個執行緒修改了共享變數的值,其它執行緒能立即感知到這種變化;volatile變數保證了多執行緒環境下變數的可見性,但不能保證原子操作;
除了volatile之外,還有兩個關鍵字也可以保證可見性,它們是synchronized和final;
所以可以看到synchronized即可以保證原子性也可以保證可見性;
3.有序性
Java程式中,如果在本執行緒中觀察,所有的操作都是有序的;如果在另一個執行緒觀察,所有的操作都是無序的。前半句指的是執行緒內表現為序列的語義,後半句指的是指令重排序和主記憶體和工作記憶體同步延遲的問題;
Java中提供了volatile和synchronized兩個關鍵字來保證有序性。