我在 Java 的多线程概念方面很差。
我正在浏览 ReentrantLock 的功能和用法。我知道它比同步更灵活,并添加了更多功能。
我可以看到上面提到的例子,我做得很好。
我无法弄清楚它对业务有帮助的实时场景。
我可以看到最好避免死锁。
有人可以提供没有 ReentrantLock 就很难解决这种用例的用例。
或者可以指向一些链接会有所帮助。
我在 Java 的多线程概念方面很差。
我正在浏览 ReentrantLock 的功能和用法。我知道它比同步更灵活,并添加了更多功能。
我可以看到上面提到的例子,我做得很好。
我无法弄清楚它对业务有帮助的实时场景。
我可以看到最好避免死锁。
有人可以提供没有 ReentrantLock 就很难解决这种用例的用例。
或者可以指向一些链接会有所帮助。
对于一个简单的情况,对于需要性能的应用程序来说,定时锁定/或部分锁定如何。
一个非常常见的例子是在线门户网站,它可以让您购买/预订门票(任何)。您会在您感兴趣的座位/资源上获得一个定时锁定。时间到期后,如果事务未完成,任何其他客户端应用程序(线程)都可以获取它的锁定。
ReentrantLock
可用于超时要求。假设您正在尝试获取锁,但在那个时间点已经获取了锁,您可以使用tryLock()
该锁将立即返回,稍后您可以重试。
ReentrantLock
通过其 con 结构提供 fairLock 或 unFair 的其他一些优点:
public ReentrantLock(boolean fair)
如果你把fair
as false
than 它不会为你提供一个公平排序的锁。并且不公平的排序执行公平的锁定。如果您需要更多详细信息,我可以解释这一点。
但问题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();
}
}
}
对于ReentrantLock
课程,synchronized
我认为与普通课程相比,主要好处是:
另外,有点跑题了,但是为了理解 Java 并发类,我发现Java Concurrent Animated非常有用。下载可运行的 jar 文件并亲自查看。
看看:https ://stackoverflow.com/a/1312282/668951 同样在我的情况下,我在亨利·黄的书中 读到了它,虽然不是很详细。