为什么会出现CAS无锁机制这个概念:我们先来说说传统synchronzied锁缺陷。悲观:如果没有获取到锁的情况下,会让当前的线程变为阻塞的状态,释放cpu执行权,效率不是太高。而且会产生死锁现象,比如同步中嵌套同步,可能就会出现死锁。
乐观锁:本质就是没有锁:所以也没有死锁的这个概念,效率非常之高,这点无需质疑。不会释放cpu执行权,其主要是通过预值比较或者版本号码控制。
UnSafe类 里面有三个值:分别为 v e n
v =- 内存值 (共享变量)
e = 旧预值 (读取的v的副本值 工作内存值)
n = 新值 需要修改我们共享变量值
Cas是通过硬件指令,保证原子性,硬件底层已经帮我们实现好了。
我们用代码实现一下:基于jAVACas实现乐观锁:
public class Demo extends Thread{
private static AtomicLong atomicLong = new AtomicLong();
@Override
public void run() {
while (atomicLong.get() < 10){
long l = atomicLong.incrementAndGet();
System.out.println(Thread.currentThread().getName()+","+l);
}
}
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
Demo t1 = new Demo();
Demo t2 = new Demo();
t1.start();
t2.start();
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
}
我们来看输出结果,虽然不保证原子性,但是绝对不允许重复。
我们来基于CAS手写乐观锁: