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