synchronized和ReentrantLock底层原理差别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了synchronized和ReentrantLock底层原理差别相关的知识,希望对你有一定的参考价值。

网上很多synchronized和ReentrantLock使用和编程时写法差异的总结,这里就不列举了;

这里主要列举一下在底层实现上的一些区别:

1、synchronized

      synchronized关键字需要一个引用类型的参数,这个参数也叫做监听器(monitor);JVM通过这个监听器来管理所有需要同步的线程(synchronized这个监听器的所有线程)运行状态,成功占有该monitor的线程即成为该监听器的owner,其他线程则被状态切换至阻塞状态并维护在一个队列中准备下一次的竞争;

大家知道线程在不同状态之间切换是比较消耗cpu资源的,所以使用synchronized处理较大并发的场景性能开销是比较大的;

(大致可以这样理解,如果有兴趣可以查看反编译带有synchronized的class文件,内在实现还是挺复杂的)

2、ReentrantLock

多个线程调用同一个ReentrantLock对象的lock()方法时,大致原理是每个线程都尝试去修改锁对象内一个状态属性state(继承自java.util.concurrent.locks.AbstractQueuedSynchronizer)的值,这个修改过程采用了CAS(compare  and swap)技术即每个线程都想把这个变量从数值0改变成1;

如果一个线程修改成功则成功锁对象的owner,否则

以上是关于synchronized和ReentrantLock底层原理差别的主要内容,如果未能解决你的问题,请参考以下文章

Java中的Lock接口

ReentrantLock (重入锁) 源码浅析

ThreadLocal使用和原理简析

一线互联网常见的14个Java面试题,你颤抖了吗程序员?

Java并发编程15ReentrantLock实现原理深入探究

《Java并发编程的艺术》读后笔记-第五章 Java中的锁