溫習《Java併發編程的藝術》java
輕量級的synchonized編程
在多處理器開發保證了共享變了的可見性(一個線程修改了一個共享變了,另一個線程可以讀取這個修改的值)數組
Lock前綴指令會引發處理器緩存回寫到內存緩存
一個處理器的緩存回到內存會致使其餘處理器的緩存無效併發
準確和一致地更新共享變量jvm
追加字節能優化性能高併發
爲何追加64字節可以提升併發編程的效率呢性能
在下面兩種狀況不該該是用64字節 緩存行非64字節寬的處理器 緩存變量不會被頻繁地寫優化
對於普通同步形式,鎖是當前實例對象線程
對於靜態同步方法,鎖是當前Class對象
對於同步方法塊,鎖是synchonized括號裏配置的對象
jvm基於進入和退出Monitor對象來實現方法同步和代碼同步
使用monitorenter和monitorexit指令實現,在編譯後插入到插入代碼
synchonized用的鎖是存在java對象頭裏的,數組用3個字寬存儲對象頭,非數組用2個字寬存儲對象頭
Markword 默認存儲對象的Hashcode、分代年齡、鎖標記位
從1.6之後爲了減小得到鎖和釋放鎖帶來的性能消耗,引入了偏向鎖和輕量鎖
無鎖狀態
偏向鎖狀態
輕量鎖狀態
重量鎖狀態
名詞解釋
內存屏障
緩存行
原子操做
緩存行填充
緩存命中
寫命中
寫缺失