【基礎知識】多線程

  1. 點擊查看例子詳情
  2. 原子性操作概念
    原子性操作 即爲不可中斷的操作,比如賦值 int i=5; 原子操作本身是線程安全的,但是i++是由3個步驟實現(取i值,i+1,新值賦予i),不是原子操作。 
  3. 原子類
    JDK6以後新增包java.util.concurrent.atomic,裏面有各種原子類,比如AtomicInteger,AtomicInteger提供了各種自增,自減等方法,這些方法都是原子性的。
    AtomicBoolean:原子更新布爾類型;
    AtomicInteger:原子更新整型;
    AtomicLong:原子更新長整型。
  4. 常用方法
    int getAndIncrement() 自增,返回舊值(即加1前的原始值);
    decrementAndGet() 自減,返回新值(即減1後的值);
    incrementAndGet() 自增,返回新值(即加1後的值);
    int addAndGet(int delta) :以原子方式將輸入的數值與實例中的值(AtomicInteger裏的value)相加,並返回結果;
    boolean compareAndSet(int expect, int update) :如果輸入的數值等於預期值,則以原子方式將該值設置爲輸入的值;
    void lazySet(int newValue):最終會設置成newValue,使用lazySet設置值後,可能導致其他線程在之後的一小段時間內還是可以讀到舊的值。
  5. 原子更新數組類:通過原子的方式更新數組裏的某個元素
    AtomicIntegerArray:原子更新整型數組裏的元素;
    AtomicLongArray:原子更新長整型數組裏的元素;
    AtomicReferenceArray:原子更新引用類型數組裏的元素。
    AtomicIntegerArray類常用方法:
    int addAndGet(int i, int delta):以原子方式將輸入值與數組中索引i的元素相加。
    boolean compareAndSet(int i, int expect, int update):如果當前值等於預期值,則以原子方式將數組位置i的元素設置成update值
  6. 原子更新數組類:原子更新基本類型的AtomicInteger,只能更新一個變量,如果要原子的更新多個變量,就需要使用這個原子更新引用類型提供的類
    AtomicReference:原子更新引用類型。
    AtomicReferenceFieldUpdater:原子更新引用類型裏的字段。
    AtomicMarkableReference:原子更新帶有標記位的引用類型。可以原子的更新一個布爾類型的標記位和引用類型。構造方法是AtomicMarkableReference(V initialRef, boolean initialMark)
  7. 原子更新字段類
    AtomicIntegerFieldUpdater:原子更新整型的字段的更新器。
    AtomicLongFieldUpdater:原子更新長整型字段的更新器。
    AtomicStampedReference:原子更新帶有版本號的引用類型。該類將整數值與引用關聯起來,可用於原子的更數據和數據的版本號,可以解決使用CAS進行原子更新時,可能出現的ABA問題。
  8. 原子更新字段類都是抽象類,每次使用都時候必須使用靜態方法newUpdater創建一個更新器。原子更新類的字段的必須使用public volatile修飾符。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章