我们知道synchronized同一时刻只能有一个线程获得对象的monitor监听器,这有时候就会导致我们的效率大大降低,所以引出了锁的优化,锁的优化也就是锁的几种状态,在这之前有两个概念需要知道:CAS操作和java对象头。
CAS操作
什么是CAS操作?
我们平时所说的获取锁其实是一种悲观锁的操作,假设在访问临界区代码的时候都会有冲突,这就意味着只有一个线程获取到锁,而别的线程都会被阻塞。而CAS操作是一种乐观锁,它假设不会有 冲突,那么自然就不会有阻塞的线程,那么一旦有了冲突有了冲突,又是怎么处理的呢?无锁操作是使用CAS(compare and swap)又叫做比较交换来鉴别线程是否出现冲突,出现冲突就重试当前操作直到没有冲突为止。
CAS的操作过程
CAS比较交换的过程可以通俗的理解为CAS(V,O,N),包含三个值分别为:V 内存地址存放的实际值;O 预期的值(旧值);N 更新的新值。当V和O相同时,也就是说旧值和内存中实际的值相同表明该值没有被其他线程更改过,即该旧值O就是目前来说最新的值了,自然而然可以将新值N赋值给V。反之,V和O不相同,表明该值已经被其他线程改过了则该旧值O不是最新版本的值了,所以不能将新值N赋给V,返回V即可。当多个线程使用CAS操作一个变量时,只有一个线程会成功,并成功更新,其余会失败。失败的线程会重新尝试,当然也可以选择挂起线程。
未优化前和