Java并发编程-无锁

2019-04-04  本文已影响0人  agile4j

1.比较交换(CAS)

1.CAS的优缺点

  1. 会增加代码复杂度
  1. 因其非阻塞性,从而对死锁问题天生免疫
  2. 线程间的相互影响远小于基于锁的方式
  3. 不会有锁竞争和系统带来的系统开销

2.CAS的算法过程

  1. V表示要更新的变量
  2. E表示预期值
  3. N表示新值

2.基于CAS的、无锁的线程安全整数:AtomicInteger

private volatile int value; // 保存了AtomicInteger的当前实际值
private static final long valueOffset; // 保存着value字段在AtomicInteger对象中的偏移量

3.Java中的指针:Unsafe类

public final int incrementAndGet() {
    return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
  1. JDK1.7


  2. JDK1.8
  public static Unsafe getUnsafe() {
      Class var0 = Reflection.getCallerClass();
      if (!VM.isSystemDomainLoader(var0.getClassLoader())) {
          throw new SecurityException("Unsafe");
      } else {
          return theUnsafe;
      }
  }

4.无锁的对象引用:AtomicReference

5.带有时间戳的对象引用:AtomicStampedReference

6.无锁的原子数组:AtomicIntegerArray

7.让普通变量也享受原子操作:AtomicIntegerFieldUpdater

  1. Updater只能修改它可见范围内的变量。因为Updater使用反射得到这个变量。如果变量不可见,就会出错,比如将变量声明为private,就是不可行的。
  2. 为了确保变量被正确的读取,它必须是volatile类型的。如果原有代码中未声明为这个类型,那么简单地声明一下就行,这不会引起任何问题。
  3. 由于CAS操作会通过对象实例中的偏移量直接进行赋值,因此,它不支持static字段(Unsafe.objectFieldOffset()不支持静态变量)

END

参考资料:《实战Java高并发程序设计》

上一篇下一篇

猜你喜欢

热点阅读