原子类
在Dawid Kurzyniec先生的util.concurrent包中最基本的类就是在edu.mory.mathcs.backport.java.util.concurrent.atomic中的原子类了。
下面本人先从AtomicInteger类look。。
AtomicInteger类说明:
一个整数值可以被原子地更新。一个AtomicInteger作为原子增长计数器被用在应用程序中,不能够替换java.lang.Integer使用。但是这个类是Number抽象类的扩展,可以被处理基于number类的工具访问。
以下便是AtomicInteger的源代码:
//AtomicInteger类扩展了Number类,并且可序列化
public class AtomicInteger extends Number implements java.io.Serializable {
private static final long serialVersionUID = 6214790243416807050L;
//整数值
private int value;
/**
* 使用初始化值构造一个AtomicInteger.
*
* @param 初始化值
*/
public AtomicInteger(int initialValue) {
value = initialValue;
}
/**
* 使用0构造一个AtomicInteger..
*/
public AtomicInteger() {
}
/**
* 获取AtomicInteger的值.
*
* @return 返回AtomicInteger的当前值
*/
public final synchronized int get() {
return value;
}
/**
* 给AtomicInteger赋新值
*
* @param 传入的新值
*/
public final synchronized void set(int newValue) {
value = newValue;
}
/**
* 设置新值,返回旧值.
*
* @param 传入的新值
* @return 返回旧值
*/
public final synchronized int getAndSet(int newValue) {
int old = value;
value = newValue;
return old;
}
/**
* 原子地更新指定值为新值
* 如果当前值等于期待的值(expect)
* @param 期待的值
* @param 传入的新值
* @return 如果更新成功,返回true。否则返回False
*/
public final synchronized boolean compareAndSet(int expect, int update) {
boolean success = (expect == value);
if (success)
value = update;
return success;
}
/**
* 原子地更新指定值为新值
* 如果当前值等于期待值(expect).
* 可能会不真实的失败.
* @param 期待值
* @param 传入的新值
* @return如果更新成功,返回true。
*/
public final synchronized boolean weakCompareAndSet(int expect, int update) {
boolean success = (expect == value);
if (success)
value = update;
return success;
}
/**
* 原子地递增1
* @return 返回增加前的旧值
*/
public final synchronized int getAndIncrement() {
return value++;
}
/**
* 原子地递增1
* @return 返回增加后的新值
*/
public final synchronized int incrementAndGet() {
return ++value;
}
/**
* 原子地递减1
* @return 返回递减前的旧值
*/
public final synchronized int getAndDecrement() {
return value--;
}
/**
* 原子地递减1
* @return 返回递减后的新值
*/
public final synchronized int decrementAndGet() {
return --value;
}
/**
* 原子地增加某个增量(delta)
* @param 增量delta
* @return 返回增加前的旧值
*/
public final synchronized int getAndAdd(int delta) {
int old = value;
value += delta;
return old;
}
/**
* 原子地增加某个增量(delta)
* @param增量delta
* @return返回增加后的新值
*/
public final synchronized int addAndGet(int delta) {
return value += delta;
}
/**
* 原子地更新旧值为新值
*
* @param 传入的新值
* @return 返回旧值
*/
public final synchronized int getAndSet(int newValue) {
int old = value;
value = newValue;
return old;
}
/**
* 返回当前值的字符串表达式.
* @return返回当前值的字符串表达式.
*/
public String toString() {
return Integer.toString(get());
}
public int intValue() {
return get();
}
public long longValue() {
return (long)get();
}
public float floatValue() {
return (float)get();
}
public double doubleValue() {
return (double)get();
}
}
总得来说,基本工作原理是使用了同步synchronized的方法实现了对一个整型数值的增、减、赋值(更新)。使对AtomicInteger的值操作成为原子操作。
另外的AtomicLong、AtomicLongArray、AtomicIntegerArray、AtomicBoolean、AtomicReference、AtomicMarkableReference、AtomicReferenceArray、AtomicStampedReference类的工作原理同理。