Java原子類操作
java的原子類放在java.util.concurrent.atomic包下面,常用的有以下這些類:
- AtomicBoolean
- AtomicInteger
- AtomicIntegerArray
- AtomicIntegerFieldUpdater
- AtomicLong
- AtomicLongArray
- AtomicLongFieldUpdater
- AtomicReference
下面將用代碼來展示上面部分類的操作,基本操作都是相通的。
AtomicInteger類是一個實現原子操作的Integer類,常用的函數有:
- getAndIncrement():完成 i++操作
- IncrementAndget():完成 ++i操作
- AddAndget(int i) :完成 value+i操作
AtomicintegerArray類是一個實現原子操作的整形數組類,提供了兩種構造函數:AtomicIntegerArray(int length)和AtomicIntegerArray(int[] array),其常用的函數和AtomicInteger類相似。
- addAndGet(int i, int delta):對index爲i的數組元素加delta
AtomicReference類爲實現原子操作的引用類。
AtomicIntegerFieldUpdater類是一個對類內的Integer變量操作的類。其構造函數爲:
AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass,String fieldName)
其中tclass是被操作的類,fieldName爲類內的變量名,下面給出了使用方式,old變量需要加上public和volatile關鍵字修飾。
AtomicIntegerFieldUpdater<User> old = AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
package com.concur.dlutzy;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicReference;
class User{
public volatile int old;
public int getOld() {
return old;
}
public void setOld(int old) {
this.old = old;
}
}
public class Sequence {
private AtomicInteger value = new AtomicInteger(0);
private int [] s = {2,1,4,6};
AtomicIntegerArray a = new AtomicIntegerArray(s);
AtomicReference<User> user = new AtomicReference<>();
AtomicIntegerFieldUpdater<User> old = AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
/**
* @return
*/
public int getNext() {
//爲s數組的第一個元素加10
a.addAndGet(0, 10);
//爲s數組的第三個元素+1
a.getAndIncrement(2);
System.out.println(a.toString());
User user = new User();
//爲old++
System.out.println(old.incrementAndGet(user));
System.out.println(old.incrementAndGet(user));
return value.incrementAndGet();
}
public static void main(String[] args) {
Sequence s = new Sequence();
new Thread(new Runnable() {
@Override
public void run() {
// while(true) {
System.out.println(Thread.currentThread().getName() + " " + s.getNext());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
// }
// System.out.println("----------------");
}
}
}).start();
}
}
輸出結果爲
[12, 1, 5, 6]
1
2
Thread-0 1