下面來具體講解volatile的兩條實(shí)現(xiàn)原則廉嚼。
1)Lock前綴指令會(huì)引起處理器緩存回寫到內(nèi)存
2)一個(gè)處理器的緩存回寫到內(nèi)存會(huì)導(dǎo)致其他處理器的緩存無效礼患。
利用synchronized實(shí)現(xiàn)同步的基礎(chǔ):Java中的每一個(gè)對(duì)象都可以作為鎖枯途。具體表現(xiàn)
為以下3種形式刊棕。
·對(duì)于普通同步方法钢猛,鎖是當(dāng)前實(shí)例對(duì)象。
·對(duì)于靜態(tài)同步方法衍慎,鎖是當(dāng)前類的Class對(duì)象转唉。
·對(duì)于同步方法塊,鎖是Synchonized括號(hào)里配置的對(duì)象西饵。
鎖一共有4種狀態(tài)酝掩,級(jí)別從低到高依次是:無鎖狀態(tài)鳞芙、偏向鎖狀態(tài)眷柔、輕量級(jí)鎖狀
態(tài)和重量級(jí)鎖狀態(tài)期虾,這幾個(gè)狀態(tài)會(huì)隨著競(jìng)爭(zhēng)情況逐漸升級(jí)。鎖可以升級(jí)但不能降級(jí)
處理器如何實(shí)現(xiàn)原子操作
第一個(gè)機(jī)制是通過總線鎖保證原子性
第二個(gè)機(jī)制是通過緩存鎖定來保證原子性
?
Java如何實(shí)現(xiàn)原子操作
在Java中可以通過鎖和循環(huán)CAS的方式來實(shí)現(xiàn)原子操作驯嘱。
?
CAS實(shí)現(xiàn)原子操作的三大問題
1)ABA問題镶苞。2)循環(huán)時(shí)間長(zhǎng)開銷大。3)只能保證一個(gè)共享變量的原子操作鞠评。
?
?
在并發(fā)編程中茂蚓,需要處理兩個(gè)關(guān)鍵問題:線程之間如何通信及線程之間如何同步
線程之間的通信機(jī)制有兩種:共享內(nèi)存和消息傳遞。
?
Java線程之間的通信由Java內(nèi)存模型(本文簡(jiǎn)稱為JMM)控制