基于Synchronized和Lock实现的同步锁机制,属于悲观锁,保护线程安全最直观的方式。
悲观锁在高并发场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统的上下文切换,增加系统的性能开销。
乐观锁:在操作共享资源时,总是抱着乐观的态度执行,认为自己可以成功的完成操作;但当多个线程同时操作一个共享资源时,只有一个线程会成功,而失败的线程不会像悲观锁一样在操作系统中挂起,而仅仅是返回,并且系统允许失败的线程重试,也允许自动放弃退出操作。
所以,乐观锁相对悲观锁来说,不会带来死锁、饥饿等活性故障问题,线程间的相互影响也远远比悲观锁小;乐观锁没有因竞争造成的系统开销,在性能上也更胜一筹。
乐观锁的实现原理
CAS是实现乐观锁的核心算法,它包含了三个参数:共享变量的内存地址A、用于比较的值B、共享变量的新值C;只有当内存地址A处的值等于B时,才能将内存地址A处的值更新为新值C。作为一条CPU指令,CAS指令本身是能够保证原子性的。
CAS如何实现原子操作?
在JDK的concurrent包中,atomic路径下的类都是基于CAS实现的;
AtomicInteger依赖于本地方法Unsafe类,Unsafe中的操作方法会调用CPU底层指令实现原子操作。
//基于CAS操作更新值
public final boolean compareAndSet(int expect, int update) {
return