#concurrent atomic包 和 Unsafe 类
atomic 包
AtomicBoolean、AtomicInteger、AtomicIntegerArray(数组)、AtomicLong、AtomicLongArray、AtomicReference
public class AtomicInteger extends Number implements java.io.Serializable {
// setup to use Unsafe.compareAndSwapInt for updates
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;
}
Unsafe 类
并发编程下面有一个类是不能避免的,Unsafe,通过使用该类提供的一系列方法,可以执行更低层次不安全的操作;虽然这个类和它的所有方法都是 puplic 的,但是被限制使用再只有可信任的代码才能获得实例;注释大体是这个意思,应用层代码不提供实例化的方法,得通过以下方法调用
private static Unsafe getUnsafeInstance() throws SecurityException,
NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeInstance.setAccessible(true);
return (Unsafe) theUnsafeInstance.get(Unsafe.class);
}
// offset 就是具体类的字段内存偏移量
static {
try {
unsafe = getUnsafeInstance();
offset = unsafe.objectFieldOffset(UnsafeTest.class.getDeclaredField("flag"));
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
// 类似调用 Unsafe 的方法就可以了
private boolean doSwap(long offset, int expect, int update) {
return unsafe.compareAndSwapInt(this, offset, expect, update);
}
/**
* A collection of methods for performing low-level, unsafe operations.
* Although the class and all methods are public, use of this class is
* limited because only trusted code can obtain instances of it.
*
* @author John R. Rose
* @see #getUnsafe
*/
public final class Unsafe {
// 内部实例的名字,
private static final Unsafe theUnsafe = new Unsafe();
// 唯一的get获取实例方法,但是被限制了,根据类加载机制,一般的应用代码肯定会抛出异常,只能通过上面的方法获取
@CallerSensitive
public static Unsafe getUnsafe() {
Class cc = Reflection.getCallerClass();
if (cc.getClassLoader() != null)
throw new SecurityException("Unsafe");
return theUnsafe;
}
}