乐趣区

关于lock:ReentrantLock

1.Synchronized 和 ReentrantLock 的区别
​ ①ReentrantLock 显示地取得,开释锁,synchronized 隐式取得开释锁

​ ②ReentrantLock 可响应中断,可轮回,synchronized 是不能够响应中断的

​ ③ReentrantLock 是 API 级别的,synchronized 是 JVM 级别的

​ ④ReentrantLock 能够实现偏心锁

​ ⑤ReentrantLock 通过 Condition 能够绑定多个条件

​ ⑥底层实现不一样,synchronized 是同步阻塞,应用的是乐观并发策略,lock 是同步非阻塞,采纳的是乐观并发策略。

​ ⑦Lock 是一个接口,而 synchronized 是 java 中的关键字,synchronized 是内置的语言实现

​ ⑧synchronized 在产生异样时,会主动开释线程占有的锁,因而不会导致死锁景象产生;而 Lock 在产生异样时,如果没有被动通过 unLock() 去开释锁,则很可能造成死锁景象,因而应用 Lock 时须要在 finally 块中开释锁。

2.Synchronized 底层如何实现?锁降级过程
synchronized 底层通过不同的锁实现。

线程获取共享资源时。

第一步:查看 MarkWord 外面是不是放的本人的 ThreadId,如果是,示意以后线程是处于“偏差锁”。

第二步:如果 MarkWord 不是本人的 ThreadId,锁降级,这时候,用 CAS 来执行切换,新的线程依据 MarkWord 里现有的 ThreadId,告诉之前线程暂停,之前线程将 Markword 的内容置为空。

第三步:两个线程都把锁对象的 HashCode 复制到本人新建的用于存储锁的记录空间,接着开始通过 CAS 操作,把锁对象的 MarkWord 的内容批改为本人新建的记录空间的地址的形式竞争 MarkWord。

第四步:第三步中胜利执行 CAS 的取得资源,失败的则进入自旋。

第五步,自旋的线程在自旋过程中,胜利取得资源(即之前取得资源的线程执行实现并开释了共享资源),则整个状态仍然处于轻量级锁的状态,如果自旋失败。

第六步,进入重量级锁的状态,这个时候,自旋的线程进行阻塞,期待之前线程执行实现并唤醒本人

退出移动版