无锁,也是不阻塞的情况,但是它会让多个线程竞争中,有一个得到胜出、
无锁的实现原理,
CAS指令。compare and swap 。比较后交换。
CAS操作的 ,通过底层计算机指令确保原子操作。
CAS 算法的过程是这样的: 它包含3个参数CAS(V, E, N)。V 表示要更新的变量,E 表示预期值, N 表示新值。 仅当
V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成操作。当多个线程同时使用CAS 操操作一个变量时,只有一个胜出,并成功更新,其余均会失败。失败线程不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。基于这样的原理,CAS 操作即使没有锁,也可以发现其他线程对当前线程的干扰,并进行适当的处理。
java上的体现:
AutomicInteger
AutomicReference
AutomicStampedReference 是为了解决多线程环境下的ABA 问题。
AutomicIntegerArray
AutomicIntegerFieledUpdater
JDK 8新增 :LongAdder
AutomicInteger 中的 getAndIncrement() {
for(;;) {
int current = get();
int next = current + 1;
if(compareAndSet(current, next))
return current;
}
}
在并发容容器类中,可以看到部分容器使用的是 tryLockInterrupt(),tryLock 与 Lock 的区别是,tryLock ,并没有真正上锁。
Mark 学习下:
https://www.cnblogs.com/linghu-java/p/8944784.html