Java 杂谈写作与程序程序员

学习Java基础知识,打通面试关~十四锁机制

2018-07-07  本文已影响27人  胖琪的升级之路

在java中,我们进行多线程操作的时候,一般都会用到锁的机制。并且在锁中我们一般用到的是synchronized和ReentrantLock两种,当然还有更加细化的读写锁。我们这里api的使用不讲解。在学习锁机制之前,我们需要了解几个概念。

synchronized

该锁在使用方式可以参考我原先写的java多线程系列文章
我们知道synchronized的锁机制是建立在monitorenter/monitorexit指令上的。基本单元是Monitor。
在jdk1.6之前Monitor之前主要是依赖操作系统内部的机制来实现同步的。这样实现的锁机制在执行时会消耗很大的资源,导致锁机制同步的很慢。
在jdk1.6以后锁机制进行了修改,主要修改的方向是在jvm上的修改。改变了锁机制采用了锁的升降级操作。里面涉及到的偏向锁,轻量级锁,重量级锁。

ReentrantLock

ReentrantLock建立在AQS(AbstractQueuedSynchronizer)的操作上的。

  1. 该锁机制更加灵活方便,可以设置锁的公平性,获取释放锁等。
  2. AbstractQueuedSynchronizer是独占的同步器,内部使用 exclusiveOwnerThread表示独占的线程,并且使用CLH锁队列来将并发执行改成串行执行,整个队列是一个双向的链表,每个CLH锁队列的节点会保存前一个节点和后一个节点的引用,当前节点对应的线程,一集一个状态。这个状态表示线程是否阻塞block.
  3. 锁获取主要分为两个部分,第一阶段是初次进行竞争主要来烤火节点是否分为公平锁还是不公平锁。 第二阶段是在CHL队列中的锁,依赖CAS操作保证原子操作。使队列并发操作改成了串行操作。消除并发带来的问题
    4.ReentrantLock 是一个轻量级的锁。
上一篇 下一篇

猜你喜欢

热点阅读