大型o2o網(wǎng)站開發(fā)時間怎么建造自己的網(wǎng)站
一:為什么要有JMM,它為什么出現(xiàn)?
CPU的運行并不是直接操作內(nèi)存而是先把內(nèi)存里面的數(shù)據(jù)讀到緩存,而內(nèi)存的讀和寫操作的時候會造成不一致的問題。JVM規(guī)范中試圖定義一種Java內(nèi)存模型來屏蔽掉各種硬件和操作系統(tǒng)的內(nèi)存訪問差異,以實現(xiàn)讓Java程序再各種平臺下都能達到一致性的內(nèi)存訪問效果。
二:JMM是什么?
JMM本身是一種抽象的概念并不真實存在,它僅僅描述的是一組約定或規(guī)范,通過這組規(guī)范定義了程序中(尤其是多線程)各個變量的讀寫訪問方式并決定一個線程對共享變量的寫入以及如何變成對另一個線程可見,
三:JMM作用和功能是什么?
1:通過JMM來實現(xiàn)線程和主內(nèi)存之間的抽象關(guān)系
2:屏蔽各個硬件平臺和操作系統(tǒng)的內(nèi)存訪問差異以實現(xiàn)讓Java程序在各種平臺下都能達到一致性的內(nèi)存訪問效果。
四:JMM規(guī)范下三大特性
1:可見性:是指當(dāng)一個線程修改了某一個共享變量的值,其他線程是否能夠立即知道該變更,JMM規(guī)定了所有的變量都存儲在主內(nèi)存
2:原子性:指一個操作是不可被打斷的
3:有序性:編譯器和處理器通常會對指令序列進行重新排序。多線程環(huán)境中線程交替執(zhí)行,由于編譯器優(yōu)化重排的存在,可能出現(xiàn)亂序現(xiàn)象,兩個線程使用的變量能否保證一致性是無法確定的,結(jié)果無法預(yù)測。
五:JMM規(guī)范下多線程先行發(fā)生原則
1:如果一個操作happens-before另一個操作,那么第一個操作的執(zhí)行結(jié)果將對第二個操作可見,而且第一個操作的執(zhí)行順序排在第二個操作之前。
2:如果兩個操作之間存在happens-before關(guān)系,并不意味著一定要按照happens-before原則制定的順序來執(zhí)行。如果重排之后的執(zhí)行結(jié)果與按照happens-before關(guān)系來執(zhí)行的結(jié)果一致,那么這種重排序并不非法。