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() {````}
```
}