目录

Java中的锁

你都了解java一些什么锁?

  • 锁的话比如说Synchronized,然后还有我们的ren,还有我们的ReentrantLock,读写锁了解的不多就没有研究了

Synchronized的实现原理

  • Synchronized是我们JVM中实现的一种锁,然后这种锁,这种锁的一种获取啊,和它的释放方式啊, 分别都是我们的monitorenter,还有我们的monitorexit的一个指令, 那这个锁在实现上分为了我们的而偏向锁还有我们的轻量级锁,还有我们的重量级锁, 其中我们的偏向锁在1.6是默认开启的,然后轻量级锁呢是在我们的多线程竞争里面情况下, 他是会膨胀成重量级锁,也就是说有关于我们的这个锁的数据,他都会保存在我们的这个对象头中。

ReentrantLock的实现原理

  • ReentrantLock他是基于AQS实现的

什么是AQS?

  • 就是在我们的AQS的内部中会保存一个变量state,一个状态变量state,然后通过CAS去修改这个变量值, 如果有修改成功的话,这个线程就会被表示我们获取到了这个锁, 如果没有修改成功的话就是或者说,我们发现这个state,已经是一个加锁状态, 那么就是通过一个waiter,这个对象封装线程,添加到等待队列里面,然后我们再把他给挂起啊,等待被唤醒。

CAS实现原理

  • CAS是通过unsafe类里面的compareAndSwap方法实现的。
  • 那你知道这个方法里面的具体参数含义吗?
  • 这个看到有点久远了
  • 他第一个参数是要修改的对象,第二个参数呢,是对象中要修改变量的这个偏移量,第三个参数呢就是我们修改之前的值,然后第四个参数是我们预想修改之后的值。