synchronized既保證原子性,又保證內(nèi)存可見性,是一種線程同步的方式,是鎖機(jī)制的一種java實(shí)現(xiàn)。synchronized的實(shí)現(xiàn)基于JVM底層,JVM是基于monitor實(shí)現(xiàn)的,而monitor的實(shí)現(xiàn)依賴于操作系統(tǒng)的互斥實(shí)現(xiàn)。

語義

synchronized語義是同步,但同步有兩層含義:

  1. 互斥,即鎖的特點(diǎn)。同一時(shí)間只能有一個(gè)線程持有監(jiān)視器,因此一旦線程進(jìn)入監(jiān)視器保護(hù)的代碼塊(即臨界區(qū)),其他線程是不允許監(jiān)視器保護(hù)的代碼塊,直到前一個(gè)線程退出代碼塊?;コ庾柚沽似渌€程看到對(duì)象不一致的狀態(tài),與原子性有相同的語義。

  2. 可見。synchronized保證進(jìn)入同步代碼塊的線程,都可以看到由同一個(gè)鎖保護(hù)的之前所有的修改效果。原因是:在釋放監(jiān)視器時(shí)(即退出同步代碼塊),會(huì)將工作內(nèi)存中未映射到主內(nèi)存的工作拷貝,強(qiáng)制刷新回主內(nèi)容。在獲取監(jiān)視器是(即進(jìn)入同步代碼塊時(shí)),監(jiān)視器會(huì)使本地內(nèi)存失效,強(qiáng)制從主內(nèi)存拷貝到工作內(nèi)存。

互斥保證在線程退出前,所有對(duì)象狀態(tài)變更都對(duì)其他線程不可見;可見保證在線程進(jìn)入同步代碼塊時(shí),可以看到上一個(gè)線程對(duì)對(duì)象狀態(tài)變更的最終狀態(tài)。

線程安全與同步

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式