ReentrantLock用例

我在Java的MultiThreading概念方面很差。

我正在通过ReentrantLockfunction和用法。 我得到它更灵活然后同步并添加更多function。

我可以看到它上面提到的例子,我做得很好。

我无法弄清楚它在商业中有用的实时场景。

我可以看到最好避免死锁。

有人可以提供没有ReentrantLock的用例,很难解决这种用例。

或者可以指向某些链接会有所帮助。

对于一个简单的案例,如何对需要性能的应用程序进行定时锁定或部分锁定。

一个非常常见的例子是在线门户网站,可让您购买/预订门票(任何)。 您获得了对您感兴趣的席位/资源的定时锁定。在时间到期后,如果事务未完成,任何其他客户端应用程序(线程)都可以锁定它。

ReentrantLock可用于超时要求。 假设您正在尝试获取锁定,但锁定已经在那个时间点使用,您可以使用tryLock() ,它将立即返回,之后您可以再次尝试。

ReentrantLock还有一些其他优点:通过con结构提供fairLock或unFair:

 public ReentrantLock(boolean fair) 

如果你把fair当作false ,那么它将无法为你提供公平订购的锁定。 不公平的排序执行公平锁定。 如果您需要更多细节,我可以解释一下。

但是ReentrantLock的问题是,它很难调试,因为在日志中它无法解释锁的所有者,但在同步中它是可能的。 这是最大的劣势。

您可以使用此锁定机制实现餐饮哲学家等function。 如果两根棍子都可用,那么就吃掉其他的东西掉落你当前持有的那根棍子。

 public void run() { while (!Thread.currentThread().isInterrupted()) { if (l.getLeftLock().tryLock()) { try { if (r.getRightLock().tryLock()) { try { System.out.println("Eating philosopher1 !!!!"); } finally { r.getRightLock().unlock(); } } } finally { l.getLeftLock().unlock(); } } try { Thread.currentThread().sleep((int) (100 * Math.random())); } catch (InterruptedException ex) { Thread.currentThread().interrupt(); } } } 

对于ReentrantLock类,与我认为的plain synchronized相比,主要优点是:

  • 获取/释放不同块中的锁。
  • 有公平的锁(等待线程的FIFO)
  • 可以试着锁定
  • 可以有多个条件变量

另外,有点偏离主题,但是为了理解java并发类,我发现Java Concurrent Animated非常有用。 下载runnable jar文件并查看自己。

请看一下: https : //stackoverflow.com/a/1312282/668951另外在我的情况下,我在Henry Wong的书中读过它,虽然不是很详细。