8、Java內存模型與線程

1、Java內存模型

1.1 主內存和工作內存

Java線程<->工作內存<->內存交互<->主內存

1.2 內存間交互操作

1)lock
2)unlock
3)read
4)load
5)use
6)assign
7)store
8)write

1.3 對於volatile型變量的特殊規則

volatile型變量的兩種特性:
1)保證此變量對所有線程的可見性:當一個線程修改了此變量,新值對其他線程是立即得知的。
2)禁止指令重排序優化:對volatile變量增加一個內存屏障,不能把後面的指令重排到內存屏障之前。

由於java運算並非原子操作,導致volatile在併發下是不安全的。

在符合以下兩個條件時可以保證併發安全。
1)運算結果並不依賴變量的當前值,或者能夠確保只有單一的線程修改變量的值。
2)變量不需要與其他的狀態變量共同參考不變約束。

1.4 對於long和double型變量的特殊規則

對於64位的數據類型(long和double),讀寫操作劃分爲兩次32位的操作來進行。所以long和double是非原子性協定。

1.5 原子性、可見性與有序性

1)原子性:變量操作是原子性的。如果需要更大範圍的原子性,lock和unlock來保證,體現的是synchronized關鍵字
2)可見性:通過變量修改後將新值同步回主內存。讀取變量前從主內存刷新來實現的。volitile、synchronized和final都能實現可見性。
3)有序性:本線程所有操作都是有序的;其他線程所有操作都是無序的。volitile通過禁止指令重排來實現有序性。synchronized通過變量lock來實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章