首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >同步锁和可重入锁之间的区别?

同步锁和可重入锁之间的区别?
EN

Stack Overflow用户
提问于 2012-01-31 07:39:12
回答 2查看 18.8K关注 0票数 23

我在Java语言中使用过synchronized关键字和可重入锁,但我不明白它们有什么不同,也不知道哪一个适合于给定的情况。

我如何决定什么时候应该使用synchronized,什么时候应该使用可重入锁?

EN

回答 2

Stack Overflow用户

发布于 2017-04-02 14:02:16

这个站点清楚地提到了ReentrantLock和Java中的同步关键字之间的区别。我只是从那里复制和粘贴。

http://javarevisited.blogspot.in/2013/03/reentrantlock-example-in-java-synchronized-difference-vs-lock.html

1) ReentrantLock和synchronized关键字之间的另一个重要区别是公平性。synchronized关键字不支持公平性。任何线程在释放后都可以获取锁,不能指定优先级,另一方面可以在创建ReentrantLock实例时,通过指定公平属性来使ReentrantLock公平。公平性属性为等待时间最长的线程提供锁,以防出现争用。

2)同步锁和重入锁之间的第二个区别是tryLock()方法。ReentrantLock提供了方便的tryLock()方法,该方法仅在锁可用或未被任何其他线程持有时才获取锁。这减少了Java应用程序中等待锁的线程的阻塞。

3)在Java语言中,ReentrantLock和synchronized关键字之间还有一个值得注意的区别,即在等待锁定时中断线程的能力。在使用synchronized关键字的情况下,线程可能会被阻塞,等待锁定的时间不确定,并且没有办法控制它。ReentrantLock提供了一个名为lockInterruptibly()的方法,可用于在线程等待锁定时中断线程。类似地,如果锁在特定时间段内不可用,则可以使用带有timeout的tryLock()来超时。

4) ReentrantLock还提供了获取所有等待锁的线程列表的便捷方法。

票数 3
EN

Stack Overflow用户

发布于 2012-01-31 07:49:13

我一直认为同步是“阻力最小的攻击”。它很好用,大多数人都知道它是如何工作的,但它有一些弱点,可能会影响你在高并发下的设计。其中最重要的一点是,任何客户端都可以有效地直接访问对象的同步锁,这意味着如果它们获取并持有它,其他客户端就不能。换句话说,默认同步实现的锁定有效地“发布”了对象的内部锁定机制。啊哈。这就像给自己设置了自我造成的拒绝服务。

如果您将可重入锁设置为类的内部锁(或者只是不使用synchronized,而是在想要同步的任何地方的构造函数中新创建的内部对象上执行类似synchronize的操作),那么就消除了发布内部锁定机制的副作用,并增加了必须记住在类的发展过程中将这种内部同步应用于何处的复杂性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9072422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档