JMM中的happens-before
生活随笔
收集整理的這篇文章主要介紹了
JMM中的happens-before
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
JMM中的happens-before概念
設(shè)計(jì)的初衷
- 程序員寫(xiě)代碼時(shí),是要求內(nèi)存模型易于理解和易于編程,并且我們也希望程序能按照我們編寫(xiě)的代碼一樣,能按規(guī)則編寫(xiě)順序執(zhí)行。(強(qiáng)內(nèi)存模型,即強(qiáng)規(guī)則的內(nèi)存模型)
- 對(duì)于編譯器和處理器的實(shí)現(xiàn)來(lái)說(shuō),它們希望約束盡量少一些,所以編譯器和處理器會(huì)對(duì)指令進(jìn)行重排,讓他們盡己所能的優(yōu)化來(lái)提供性能。(弱內(nèi)存模型)
程序員希望JMM提供給我們一個(gè)強(qiáng)內(nèi)存模型,而底層的編譯器和處理器需要一個(gè)弱內(nèi)存模型來(lái)提高自己的性能。
所以JMM向我們程序員提供了足夠強(qiáng)的內(nèi)存可見(jiàn)性保證,只要不改變程序的執(zhí)行結(jié)果,編譯器和處理器想怎么優(yōu)化就怎么優(yōu)化,所以JMM在一些地方對(duì)編譯器和處理器進(jìn)行了約束,以確保可見(jiàn)性。
happens-before
在JMM中,如果一個(gè)操作執(zhí)行的結(jié)果需要對(duì)另一個(gè)操作可見(jiàn),那么這兩個(gè)操作之間必須存在happens-before關(guān)系。
happens-before使用的地方
happens-before的出現(xiàn)地方:
- 程序次序規(guī)則:一個(gè)線程內(nèi),按照代碼順序,書(shū)寫(xiě)在前面的操作先行發(fā)生于書(shū)寫(xiě)在后面的操作;
- 鎖定規(guī)則:一個(gè)unLock操作先行發(fā)生于后面對(duì)同一個(gè)鎖額lock操作;
- volatile變量規(guī)則:對(duì)一個(gè)變量的寫(xiě)操作先行發(fā)生于后面對(duì)這個(gè)變量的讀操作;
- 傳遞規(guī)則:如果操作A先行發(fā)生于操作B,而操作B又先行發(fā)生于操作C,則可以得出操作A先行發(fā)生于操作C;
- 線程啟動(dòng)規(guī)則:Thread對(duì)象的start()方法先行發(fā)生于此線程的每個(gè)一個(gè)動(dòng)作;
- 線程中斷規(guī)則:對(duì)線程interrupt()方法的調(diào)用先行發(fā)生于被中斷線程的代碼檢測(cè)到中斷事件的發(fā)生;
- 線程終結(jié)規(guī)則:線程中所有的操作都先行發(fā)生于線程的終止檢測(cè),我們可以通過(guò)Thread.join()方法結(jié)束、Thread.isAlive()的返回值手段檢測(cè)到線程已經(jīng)終止執(zhí)行;
- 對(duì)象終結(jié)規(guī)則:一個(gè)對(duì)象的初始化完成先行發(fā)生于他的finalize()方法的開(kāi)始;
總結(jié)
以上是生活随笔為你收集整理的JMM中的happens-before的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 乐高前台电脑蓝屏了乐高前台电脑蓝屏了怎么
- 下一篇: 用手机怎么修改路由器密码如何修改路由器密