首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReentrantLock用例

ReentrantLock用例
EN

Stack Overflow用户
提问于 2013-11-01 05:13:44
回答 4查看 2.6K关注 0票数 6

我对Java的MultiThreading概念非常了解。

我正在研究ReentrantLock的特性和用法。我知道它比同步更加灵活,并且增加了很少的特性。

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

我无法弄清楚,在什么情况下,它将对商业有帮助。

我看得出最好避免死锁。

如果没有ReentrantLock,就很难解决这样的用例,有人能提供用例吗?

或者可以指向某个链接将是有帮助的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-01 05:26:15

对于简单的情况,对于要求性能的应用程序,时间锁/或部分锁如何?

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

票数 5
EN

Stack Overflow用户

发布于 2013-11-01 05:43:19

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

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

代码语言:javascript
复制
public ReentrantLock(boolean fair)

如果您将fair作为false,它将不会为您提供一个带有公平排序的锁。不公平的命令执行公平的锁。如果你需要更多细节我可以解释。

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

您可以使用这种锁定机制来实现像餐饮哲学家这样的特性。如果两根棍子都可用,那就去吃吧,扔掉你现在拿着的那根。

代码语言:javascript
复制
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();
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2013-11-01 07:50:58

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

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

此外,我还有点离题,但是对于理解java并发类,我发现Java并发动画非常有用。下载可运行的jar文件并查看自己。

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

https://stackoverflow.com/questions/19721197

复制
相关文章

相似问题

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