AtomicBoolean、AtomicInteger、AtomicLong和AtomicReference類的實例都提供對相應類型的單個變量的訪問和更新。
Java課程培訓機構/認為基本原理是使用CAS運算:BooleanCompareandSet(期望值,更新值);如果這個方法(在不同的類之間有不同的參數類型)當前持有expectedValue,那麽這個變量被自動設置為updateValue,如果成功,則報告true。
循環ca,參考atomic integer:publicfinalingtandrement(){ for(;;){ int current = get();int next = current+1;if(compareAndSet(current,next))return current;} } publicfinalbooleancompareAndSet(int expect,int update){ return unsafe . compareandswapint(this,valueOffset,expect,update);}ABA問題因為CAS在操作值的時候需要檢查值是否有變化,如果沒有變化就更新,但是如果壹個值原來是A,那麽用CAS檢查的時候就會發現它的值沒有變化,實際上是變化了。
ABA問題的解決方法是使用版本號。
在變量前追加版本號,變量每更新壹次版本號加壹,那麽A-B-A就變成1A-2B-3A。
從Java1.5開始,JDK的原子包提供了壹個類AtomicStampedReference來解決ABA問題。
此類的compareAndSet方法用於首先檢查當前引用是否等於預期引用,以及當前標誌是否等於預期標誌。如果它們都相等,則以原子方式將引用和標誌的值設置為給定的更新值。
ArrayBlockingQueue數組支持的有界阻塞隊列。
該隊列根據FIFO(先進先出)原則對元素進行排序。
隊列頭是在隊列中時間最長的元素。
隊列的尾部是在隊列中停留時間最短的元素。
新元素被插入到隊列的末尾,隊列獲取操作從隊列的頭部開始。
這是壹個典型的“有界緩沖區”,其中固定大小的數組保存由生產者插入和由用戶提取的元素。
壹旦創建了這樣的緩沖區,其容量就不能增加。
試圖將壹個元素放入壹個滿隊列將會阻止該操作;試圖從空隊列中提取元素將導致類似的阻塞。
該類支持可選的公平策略,該策略對等待的生產者線程和消費者線程進行排序。
默認情況下,不保證這種排序。
但是,通過將fairness設置為true而構造的隊列允許以FIFO順序訪問線程。
公平通常會降低吞吐量,但也會降低可變性,避免“不平衡”。
Linkedblockingqueue基於鏈接節點的任意範圍的blockingqueue。
這個隊列按照FIFO(先進先出)對元素進行排序。
隊列頭是在隊列中時間最長的元素。
隊列末尾是在隊列中停留時間最短的元素。
新元素被插入到隊列的末尾,隊列獲取操作將獲得隊列頭部的元素。
鏈接隊列的吞吐量通常高於基於數組的隊列,但在大多數並發應用中,其可預測的性能較低。
可選的容量範圍構造方法參數用作防止隊列過度擴展的方法。
如果未指定容量,則它等於整數。MAX_VALUE。
除非插入節點會導致隊列超出容量,否則每次插入後都會動態創建壹個鏈接節點。
如果構造LinkedBlockingQueue對象時沒有指定其容量,LinkedBlockingQueue將默認為無限容量(整數。MAX_VALUE)。在這種情況下,如果生產者的速度比消費者的速度快,那麽系統內存可能在隊列滿之前就已經用完了。