-
java在單線程的條件下,是遵循as-if-serial語義
查看全部 -
sychronzied實現可見性的過程
查看全部 -
?解鎖前,把共享變量的最新值刷新到主內存中;
加鎖時,清空工作內存,從而使用共享變量時需要從主內存中獲取最新的值。
線程解鎖前對共享變量的修改,在下次加鎖時對其他線程可見。
查看全部 -
synchronized和volatile比較
查看全部 -
volatile實現可見性
深入來說:通過加入內存屏障和禁止重排序優化來實現的。
對volatile變量執行寫操作時,會在寫操作后加入一條store屏障指令。
對volatile變量執行讀操作時,會在讀操作前加入一條load屏障指令。
通俗地講:
volatile變量在每次被線程訪問時,都強迫從主內存中重讀該變量的值,而當該變量發生變化時,又會強迫線程將最新的值刷新到主內存,這樣任何時刻,不同的線程總能看到該變量的最新值。
線程寫volatile變量的過程:
線程讀volatile變量的過程:
查看全部 -
可見性分析
導致共享變量在線程間不可見的原因:
線程的交叉執行
重排序結合線程交叉執行
共享變量未及時更新
synchronized實現可見性代碼:在讀、寫操作的方法上加上synchronized(對應上面出現問題的解決方案)
原子性
原子性
可見性
查看全部 -
synchronized實現可見性的代碼
查看全部 -
java語言層面支持的可見性實現方式:
synchronized
volatile
synchronized實現可見性
JMM關于synchronized的兩條規定:
線程執行互斥代碼的過程:
獲得互斥鎖
清空工作內存
從主內存拷貝變量的最新副本到工作內存
執行代碼
將更改后的共享變量的值刷新到主內存中
釋放互斥鎖
重排序
as-if-serial
重排序不會給單線程帶來內存可見性問題
多線程中程序交錯執行時,重排序可能會造成內存可見性問題。
查看全部 -
可見性
java內存模型(JMM 【java Memory Model】)描述了java程序中各種變量(線程共享變量)的訪問規則,以及在JVM中將變量存儲到內存和從內存中讀取出變量這樣的底層細節。
兩條規定
共享變量可見性實現的原理
查看全部 -
volatile讀寫操作過程
查看全部 -
線程執行互斥代碼的過程
查看全部 -
64位 long、double變量的讀寫可能不是原子操作
查看全部 -
volatile只能保證變量的可見性,不能保證操作的原子性,所以只適用于一些特定場合
查看全部 -
線程對共享變量的所有操作都必須在自己的工作內存中進行,不能直接從主內存中讀寫,也就是說線程的與自己的工作內存交互,工作內存和主內存交互。線程與主內存不直接交互
查看全部 -
對64位變量的讀寫可能不是原子操作
查看全部
舉報