ReentrantLock和Synchronized的区别

原创
2019/07/02 15:49
阅读数 2.4K

相同点:都是用加锁方式控制线程同步。而且都是阻塞式的同步,即当一个线程获得了对象的锁,进入同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待。

不同点:synchronized是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock是Jdk 1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成。便利性方面:synchronized使用比较方便简洁,并且由编译器保证锁的加锁和释放。而ReentrantLock需要手动加锁和释放锁。正式由于ReetrantLock手工加锁和释放,因此锁的灵活度和细粒度更高。

synchronized优化以后,使用了偏向锁、轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized。

synchronized会在同步块的前后分别形成monitorenter和monitorexit这两个字节码指令。在执行monitorenter指令是,首先要尝试获取锁对象。如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,相应的,在执行monitorexit指令时会将锁的计算器减1。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部