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

2022-09-01 23:19:10

我在Java中使用了关键字和重入锁,但我不明白它们有何不同,或者哪个适合给定的情况。synchronized

如何决定何时应使用以及何时应使用重入锁?synchronized


答案 1

重入锁是:

重入互斥锁,其基本行为和语义与隐式监视器锁具有相同的基本行为和语义,使用同步方法和语句访问,但具有扩展功能。

扩展功能包括:

  1. 每个监视器具有多个条件变量的能力。使用同步关键字的监视器只能有一个。这意味着重入锁支持多个 wait()/notify() 队列。
  2. 使锁公平的能力。同步块是不公平的。

    “[公平]锁有利于授予对等待时间最长的线程的访问权限。否则,此锁不保证任何特定的访问顺序。

  3. 检查锁是否被持有的功能。
  4. 获取等待锁的线程列表的功能。

重入锁的缺点是:

  1. 需要添加导入语句。
  2. 需要在尝试/最终块中包装锁采集。这使得它比同步关键字更丑陋。
  3. 关键字可以放在方法定义中,从而避免了对减少嵌套的块的需求。synchronized

总结

关键字在语法上更好,但重入锁具有更多功能。synchronized


答案 2

该网站清楚地提到了Java中ReentrantLock和synced关键字之间的区别。我只是从那里复制和粘贴。

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

1)ReentantLock和同步关键字之间的另一个显着区别是公平性。同步关键字不支持公平性。任何线程都可以在释放后获取锁,不能指定首选项,另一方面,您可以通过指定公平属性来使 ReentrantLock 公平,同时创建 ReentrantLock 的实例。公平性属性在发生争用时为最长的等待线程提供锁定。

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

3)Java中ReentantLock和sync关键字之间另一个值得注意的区别是,能够在等待Lock时中断线程。在同步关键字的情况下,可以无限期地阻塞线程等待锁定,并且没有办法控制它。ReentrantLock 提供了一个名为 lockInterruptibly() 的方法,该方法可用于在等待锁定时中断线程。同样,如果锁定在特定时间段内不可用,则具有超时功能的tryLock()可用于超时。

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


推荐