AtomicInteger
AtomicInteger atomicInteger = new AtomicInteger;
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
//ABA 问题两种解决方案
AtomicStampedReference atomicStampedReference = new AtomicStampedReference;
public AtomicStampedReference(V initialRef, int initialStamp) {
pair = Pair.of(initialRef, initialStamp);
}
AtomicMarkableReference atomicMarkableReference = new AtomicMarkableReference;
public AtomicMarkableReference(V initialRef, boolean initialMark) {
pair = Pair.of(initialRef, initialMark);
}
Reentrantlock
- 部分场合可以替代synchronized
- 可以是公平锁
- 可被打断的上锁过程
- 锁上面的队列可以指定任意数量
CyclicBarrier 与 CountDownLatch 有什么区别?
CyclicBarrier 与 CountDownLatch 本质上都是依赖 volatile 和 CAS 实现的,它们区别如下:
- CountDownLatch 只能使用一次,而 CyclicBarrier 可以使用多次。
- CountDownLatch 是手动指定等待一个或多个线程执行完成再执行,而CyclicBarrier 是 n 个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
- CyclicBarrier用于等待一组线程资源都进入屏障点再共同执行