logo头像

Always believe youself.

并发编程-6

第 6 章 共享模型之无锁

  • CAS 与 volatile 结合使用
  • 原子整数
  • 原子引用
  • 原子累加器
  • Unsafe

CAS

无锁进行处理

image.png

其中的关键是compareAndSet 他的简称就是 CAS (也有 compare And Swap) 它必须是原子操作。

核心就是不断的不断的尝试,直到成功了。

企业咚咚20210901180221.jpg

volatile

企业咚咚20210901180641.jpg

为什么无锁效率高

image.png

CAS 的特点

image.png

原子整数

JUC 并发包 提供原子操作的类

  • AtomicBoolean
  • AtomicInteger
  • AtomicLong

image.png

image.png

原子引用

  • AtomicReference
  • AtomicMarkableReference
  • AtomicStampedReference

image.png

安全实现-使用CAS

image.png

原子数组

  • AtomicIntegerArray
  • AtomicLongArray
  • AtomicReferenceArray

image.png

字段更新器

某个对象里面的属性或成员变量

  • AtomicReferenceFieldUpdater
  • AtomicIntegerFieldUpdater
  • AtomicLongFieldUpdater

image.png

image.png

原子累加器

原子累加器比较

LongAccumulator LongAdder 专门做累加的,比较之前的 atomic increment 等性能要高很多。

image.png

性能提升的原因很简单,就是在有竞争时,设置多个累加的单元,Thread-0 累加 cell[0] (累加单元,跟CPU 核心数有关,不能超过),而 thread-1 累加 cell[1] …. 最后将结果汇总。这样他们在累加时操作的不同的 Cell 变量。 因此 减少了 CAS 重试失败,从而提高了性能。

image.png

缓存结构

企业咚咚20210907154528.jpg

image.png

伪共享

image.png

不会造成缓存行的失效。

1
2
// 防止缓存行伪共享
@sun.misc.contnded

Unsafe

Unsafe 对象提供了非常底层的,操作内存,线程的方法、 Unsafe 对象不能直接调用,只能通过反射获得。

image.png

原子整数类的实现

image.png