说说Java中原子性,可见性与指令重排序的理解
原子性:就是讀數(shù)據(jù),處理數(shù)據(jù),寫數(shù)據(jù) 這三個(gè)步驟不能被終止,或者打斷;就是不能被線程調(diào)度器中斷,切換線程。
這樣,才能保證,原子操作在線程切換,并行處理上保證數(shù)據(jù)地順序累加處理。
可見(jiàn)性:是Jvm較為突出的概念,其每一個(gè)線程有自己的工作內(nèi)存空間,當(dāng)某一個(gè)線程讀取了主內(nèi)存的數(shù)據(jù),那么會(huì)通知其他線程中自己的內(nèi)存空間此數(shù)據(jù)被加屏障,不可讀;只能再次從主內(nèi)存讀數(shù)據(jù)緩存到自己的內(nèi)存空間。這個(gè)概念在Java volitile 關(guān)鍵字體現(xiàn)的,其他系統(tǒng)的這種線程交互機(jī)制也應(yīng)該類似。
指令重排序:
處理器在核心計(jì)算區(qū)有算術(shù)計(jì)算芯,邏輯(與或邏輯)計(jì)算和位處理。比如:
if(i > 6) {a = b + c; }含有計(jì)算且被邏輯條件包含的代碼指令,一般在處理器上,先是在算術(shù)計(jì)算中心計(jì)算數(shù)據(jù)后放入高速緩存中;然后當(dāng)邏輯條件成立后,才會(huì)寫回到內(nèi)存中。原因就是cpu有不一樣的計(jì)算區(qū),這也是提高CPU計(jì)算能力的方式。基于此原理,那么有了指令的重排序。對(duì)于并發(fā)系統(tǒng),那么可能出現(xiàn)邏輯混亂現(xiàn)象,但是對(duì)于單線程,不存在這個(gè)問(wèn)題。指令重排序是內(nèi)核做的,所以jvm會(huì)和系統(tǒng)內(nèi)核交互不讓其指令重排序。
對(duì)于多處理器的并發(fā)系統(tǒng),那么即使遵循上面的三個(gè)原則,也是不是出現(xiàn)并發(fā)邏輯問(wèn)題呢?
由于多個(gè)處理器,那么可以并發(fā)地讀主內(nèi)存數(shù)據(jù),然后處理寫回?cái)?shù)據(jù),這樣就會(huì)出現(xiàn)邏輯混亂問(wèn)題。那么在多cpu系統(tǒng),對(duì)于多線程處理同一個(gè)方法的任務(wù)的時(shí)候,調(diào)度器只允許一個(gè)cpu處理執(zhí)行其中的一個(gè)線程。其他的線程都在等待區(qū),等待前一個(gè)線程執(zhí)行完,才會(huì)被調(diào)度,交給當(dāng)前或者其他處理器處理。也就是保證了同一塊指令多線程處理的單CPU的順序執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的说说Java中原子性,可见性与指令重排序的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: wps自带的wps看图如何卸载?以win
- 下一篇: Java 动态代理与class字节码动态