當前位置:編程學習大全網 - 編程語言 - 北大青鳥java培訓:Java並發編程常用類和集合?

北大青鳥java培訓:Java並發編程常用類和集合?

AtomicInteger可以用原子的方式更新int值。

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)。在這種情況下,如果生產者的速度比消費者的速度快,那麽系統內存可能在隊列滿之前就已經用完了。

  • 上一篇:用CserialPort類寫的串口程序,只能發送壹次
  • 下一篇:用visual lisp對CAD二次開發中怎樣新建文字樣式和標註樣式?
  • copyright 2024編程學習大全網