-
啥是无锁?
- 高并发时,"锁"的激烈竞争可能会成为系统瓶颈;无锁使用非阻塞同步的方法,在不使用锁的前提下,确保数据和程序在高并发环境下保持多线程间的一致性。
-
理解CAS
-
重申"锁"的同步方式
- 一种阻塞的线程同步方式,不同线程在锁竞争时,总不能避免相互等待,从而阻塞当前线程;
-
如何解决这个问题?
- 那就是非阻塞同步咯。代表是ThreadLocal,每个线程拥有各自独立的变量副本,在并行计算时,无需相互等待;
-
CAS算法
- 非阻塞,没有死锁,线程之间影响小,系统开销小,没有线程间调度的开销;
-
算法实现过程:
- 包含三个参数CAS(V,E,N):V:要更新的变量,E:预期值,N:新值;
- 仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做;
- 最后,CAS返回当前V的真实值;
-
多个线程同时使用CAS操作一个变量时,只有一个会成功更新,其余均会失败;
- 失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,也允许它放弃操作;
- 即使没有锁,CAS也可以发现其他线程对当前线程的干扰,并进行处理;
-
-
原子操作
-
java.util.concurrent.atomic包下,有对无锁算法实现的原子操作类;
- 主要有AtomicInteger(整数),AtomicIntegerArray(整数数组),AtomicLong(长整型),AtomicLongArray(长整型数组),AtomicReference(普通对象);
- 实现机制:在一个死循环中,不断尝试修改目标值,直到修改成功。如果竞争不激烈,会提高修改成功的概率,否则相反;失败次数过多,会影响性能;
-
-
LongAddr
-
JDK1.8在java.util.concurrent.atomic包中新引入了LongAdder类来提高原子类性能。
- LongAddr的优化思路:将热点数据value分离成多个单元cell,每个cell独自维护内部的值,当前对象的实际值由所有的cell累计合成,就对value进行了有效的分离,提高了并行度
-