42. 使用ReentrantLock保证同步
l 可重入锁ReentrantLock常用API
ü public void lock()
加锁,如果有别的线程获取了锁,则等待
ü public void unlock()
释放锁
ü public final boolean isFair()
判断该锁是否为公平锁
ü public boolean tryLock()
如果该锁未被别的线程占用,则加锁
ü public boolean tryLock(long timeout, TimeUnit unit)
throws InterruptedException
在指定等待时间内,该锁未被别的线程占用,则加锁
50. JAVA原子类保证同步
AtomicBoolean 可以用原子方式更新的 boolean 值。
AtomicInteger 可以用原子方式更新的 int 值。
AtomicIntegerArray 可以用原子方式更新其元素的 int 数组。
AtomicIntegerFieldUpdater<T> 基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原
子更新。
AtomicLong 可以用原子方式更新的 long 值。
AtomicLongArray 可以用原子方式更新其元素的 long 数组。
AtomicLongFieldUpdater<T> 基于反射的实用工具,可以对指定类的指定 volatile long 字段进行原
子更新。
AtomicMarkableReference<V> AtomicMarkableReference 维护带有标记位的对象引用,可以原子
方式对其进行更新。
AtomicReference<V> 可以用原子方式更新的对象引用。
AtomicReferenceArray<E> 可以用原子方式更新其元素的对象引用数组。
AtomicReferenceFieldUpdater<T,V> 基于反射的实用工具,可以对指定类的指定 volatile 字段进行
原子更新。
AtomicStampedReference<V> AtomicStampedReference 维护带有整数“标志”的对象引用,可以
用原子方式对其进行更新。
对单一数据的操作,实现了原子化
访问对2个或2个以上的atomic变量(或者对单个atomic变量进行2次或2次以上的操作)通常认为是需
要同步的,以达到让这些操作能被作为一个原子单元。
51. JAVA原子类保证同步
l AtomicInteger源码
AtomicInteger如何保证单一数据操作的线程安全?
//AtomicInteger中保存int值的变量,volatile 关键字保证了可见性
private volatile int value;
//构造函数
public AtomicInteger(int initialValue) {
value = initialValue;//初始化value的值
}
//自动增长
public final int incrementAndGet() {
for (;;) {
int current = get();//获取当前value值
int next = current + 1;//自动增长,加1
//调用sun.misc.Unsafe,判断value值是否被修改,如果被修改在for循环中循环改过程
//如果未被修改,返回修改后的值
//该方法是个原子方法
if (compareAndSet(current,next))
return next;
}
}