5

我在 Java 的多线程概念方面很差。

我正在浏览 ReentrantLock 的功能和用法。我知道它比同步更灵活,并添加了更多功能。

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

我无法弄清楚它对业务有帮助的实时场景。

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

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

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

4

4 回答 4

4

对于一个简单的情况,对于需要性能的应用程序来说,定时锁定/或部分锁定如何。

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

于 2013-11-01T05:26:15.327 回答
4

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

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

public ReentrantLock(boolean fair)

如果你把fairas falsethan 它不会为你提供一个公平排序的锁。并且不公平的排序执行公平的锁定。如果您需要更多详细信息,我可以解释这一点。

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

您可以使用这种锁定机制来实现诸如就餐哲学家之类的功能。如果两根棍子都可用,那就继续吃,否则放下你当前拿着的一根。

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();
        }
    }
}
于 2013-11-01T05:43:19.517 回答
2

对于ReentrantLock课程,synchronized我认为与普通课程相比,主要好处是:

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

另外,有点跑题了,但是为了理解 Java 并发类,我发现Java Concurrent Animated非常有用。下载可运行的 jar 文件并亲自查看。

于 2013-11-01T07:50:58.280 回答
0

看看:https ://stackoverflow.com/a/1312282/668951 同样在我的情况下,我在亨利·黄的书中 读到了它,虽然不是很详细。

于 2013-11-01T06:30:40.060 回答