锁 - 图1

cas—乐观锁

意思是:[比较并交换]
cas设定有三个值: 当前值(A) 内存值(V) 目标值(B),如果当前值与内存值相等,就将内存值改 目标值,不相等的话,重试或放弃更新
cas会存在ABA 问题,如果读取到的内存值,经过其他线程修改,最后与读取到的当前值相等,就会误认为没有修改过.
推荐使用LongAdder解决(增加版本号)

synchronized—互斥锁

一次只允许一个线程进入被锁住的代码块

  1. 修饰方法,锁对应的是对象实例
  2. 修饰静态方法,锁对应的是当前类,class实例
  3. 修饰的代码块,锁对应的是传入synchronized的对象实例

无论synchronized修饰的是方法还是代码块,对应的锁都是一个对象实例

实现原理

在内存中, java对象由三部分组成; 对象头\对象实际数据\对齐
对象头 又由几部分组成,对象头Mark Work 记录关于锁的信息,每个对象都有一个对应的monitor对象,monitor对象中存储着当前持有锁的线程,以及等待锁的线程队列
Mark Work 记录锁的状态有四种: 无锁 偏向锁 轻量级锁 重量级锁
每次cas操作自旋获取锁失败到一定次数就会升级

AQS — 独占 —共享

实现锁的一个框架,内部实现的关键是维护了一个先进先出的队列与state状态的变量.
Aqs支持两种模式独占与共享
ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore这些常用的实现类都是
基于AQS实现的

实现原理:

内部维护了一个先进先出的队列,与一个表示State状态的变量
这个队列是的载体叫node节点,该节点标识当前的状态值, 是独占还是共享模式以及它的前 驱和后继节点等等信息
image.png