熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

JAVA高級:多核線程-volatile原理與技巧[2]

2013-11-23 19:57:16  來源: Java高級技術 

    原因

    這裡的increase方法執行的操作是i++ 即 i = i + ;

    針對i = i + 在多線程中的運算本身需要改變i的值

    如果在i已從內存中取到最新值但未與進行運算此時其他線程已數次將運算結果賦值給i

    則當前線程結束時之前的數次運算結果都將被覆蓋

    即執行次increase 可能結果是 <

    一般來說這種情況需要較高的壓力與並發情況下才會出現

    如何避免這種情況?

    解決以上問題的方法

    一種是操作時加上同步

    這種方法無疑將大大降低程序性能且違背了volatile的初衷

    第二種方式是使用硬件原語(CAS)實現非阻塞算法

    從CPU原語上支持變量級別的低開銷同步

    CPU原語比較並交換(CompareAndSet)實現非阻塞算法

    什麼是CAS?

    cas是現代CPU提供給並發程序使用的原語操作不同的CPU有不同的使用規范

    在 Intel 處理器中比較並交換通過指令的 cmpxchg 系列實現

    PowerPC 處理器有一對名為加載並保留條件存儲的指令它們實現相同的目地

    MIPS 與 PowerPC 處理器相似除了第一個指令稱為加載鏈接

    CAS 操作包含三個操作數 內存位置(V)預期原值(A)和新值(B)

    什麼是非阻塞算法?

    一個線程的失敗或掛起不應該影響其他線程的失敗或掛起這類算法稱之為非阻塞(nonblocking)算法

    對比阻塞算法

    如果有一類並發操作其中一個線程優先得到對象監視器的鎖當其他線程到達同步邊界時就會被阻塞

    直到前一個線程釋放掉鎖後才可以繼續競爭對象鎖(當然這裡的競爭也可是公平的按先來後到的次序)

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27718.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.