天天看點

AtomicInteger學習筆記

AtomicInteger主要提供于在多線程并發中的原子操作。

在java中處理并發主要有兩種方式:

1,synchronized關鍵字,這個大家應當都各種面試和筆試中經常遇到。

2,volatile修飾符的使用,相信這個修飾符大家平時在項目中使用的也不是很多。

這裡重點說一下volatile:

Volatile修飾的成員變量在每次被線程通路時,都強迫從共享記憶體重新讀取該成員的值,而且,當成員變量值發生變化時,強迫将變化的值重新寫入共享記憶體,這樣兩個不同的線程在通路同一個共享變量的值時,始終看到的是同一個值。

java語言規範指出:為了擷取最佳的運作速度,允許線程保留共享變量的副本,當這個線程進入或者離開同步代碼塊時,才與共享成員變量進行比對,如果有變化再更新共享成員變量。這樣當多個線程同時通路一個共享變量時,可能會存在值不同步的現象。而volatile這個值的作用就是告訴VM:對于這個成員變量不能儲存它的副本,要直接與共享成員變量互動。

建議:當多個線程同時通路一個共享變量時,可以使用volatile,而當通路的變量已在synchronized代碼塊中時,不必使用。

缺點:使用volatile将使得VM優化失去作用,導緻效率較低,是以要在必要的時候使用。

Java中運用AtomicIntegr的執行個體:ThreadLocal中的成員變量threadLocalHashCode的值得擷取。

AtomicInteger:主要成員變量和成員方法

public class AtomicInteger extends Number implements java.io.Serializable
    //可以序列化對象
    private static final long serialVersionUID = 6214790243416807050L;
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;
    static {
      try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicInteger.class.getDeclaredField("value"));
      } catch (Exception ex) { throw new Error(ex); }
    }

    private volatile int value;
    ```
    //set方法
    public final int get() {```}
    //get方法
    public final void set(int newValue) {```}
    //傳回value = newValue
    public final int getAndSet(int newValue) {```}
    //傳回value + delta
    public final int getAndAdd(int delta) {```}
    //傳回value--
    public final int getAndDecrement() {```}
    //傳回--value
    public final int decrementAndGet() {```}
    //value++
    public final int getAndIncrement() {```}
    //傳回++value
    public final int incrementAndGet() {````}
    ```
}