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

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

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

    CAS語義上存在的ABA 問題

    什麼是ABA問題?

    假設第一次讀取V地址的A值 然後通過CAS來判斷V地址的值是否仍舊為A如果是就將B的值寫入V地址覆蓋A值

    但是語義上有一個漏洞當第一次讀取V的A值此時內存V的值變為B值 然後在未執行CAS前 又變回了A值

    此時CAS再執行時會判斷其正確的並進行賦值

    這種判斷值的方式來斷定內存是否被修改過針對某些問題是不適用的

    為了解決這種問題jdk 並發包提供了AtomicStampedReference(有標記的原子引用)類通過控制變量值的版本來保證CAS正確性

    其實大部分通過值的變化來CAS已經夠用了

    jdk原子包介紹(基於volatile)

    包的特色

    普通原子數值類型AtomicIntegerAtomicLong提供一些原子操作的加減運算

    使用了解決髒數據問題的經典模式比對後設定即查看主存中數據是否與預期提供的值一致如果一致才更新

    使用AtomicReference可以實現對所有對象的原子引用及賦值包括Double與Float

    但不包括對其的計算浮點的計算只能依靠同步關鍵字或Lock接口來實現了

    對數組元素裡的對象符合以上特點的也可采用原子操作包裡提供了一些數組原子操作類

    AtomicIntegerArrayAtomicLongArray等等

    大幅度提升系統吞吐量及性能

[]  []  []  []  


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