volatile
被volatile修飾的共享變量進行寫操作的時候,字節(jié)碼中會出現(xiàn)一個Lock前綴的指令。
- volatile的兩條實現(xiàn)原則
1、 Lock前綴指令會引起處理器緩存會寫到內(nèi)存
2、 處理器緩存回寫到內(nèi)存會導致其他處理器的緩存無效
這里其實就是緩存一致性協(xié)議的體現(xiàn)。 - volatile的優(yōu)化
追加字節(jié)的方式
synchronized
鎖的對象分為三種:
1、普通同步方法而言,鎖是當前實例對象
2、靜態(tài)同步方法而言,鎖是當前類的class對象
3、同步方法塊,鎖是Synchronized括號里配置的對象
JVM基于進入和退出Monitor對象來實現(xiàn)方法同步和代碼塊同步,實現(xiàn)細節(jié)不一樣
synchronized用的鎖是存在java對象頭里面的
鎖一共有4種狀態(tài):無鎖-》偏向鎖-》輕量級鎖-》重量級鎖,所可以升級但是不能降級
原子操作的實現(xiàn)原理
處理器通過總線鎖和緩存鎖實現(xiàn)原子操作。
但是有兩種情況處理器不會使用緩存鎖:
1、當操作的數(shù)據(jù)不能被緩存在處理器內(nèi)部,或者操作的數(shù)據(jù)跨多個緩存行
2、有些處理器不支持緩存鎖定
Java如何實現(xiàn)原子操作:
通過鎖和循環(huán)CAS的方式實現(xiàn)原子操作
CAS實現(xiàn)原子操作的三大問題:
1、ABA問題---解決辦法:加版本號
2、循環(huán)時間長開銷大
3、只能保證一個共享變量的原子操作