【问题标题】:Regarding multiple lock attempts, using java.concurrent.ReentrantLock关于多次锁定尝试,使用 java.concurrent.ReentrantLock
【发布时间】:2012-03-07 22:04:46
【问题描述】:

我注意到以下代码块:

    final Lock s = new ReentrantLock();
    for(int i = 0 ; i < 1000 ; i++)
    {
        s.lock();
        System.out.println(i+" :" +s.tryLock()+" ");
    }

打印:

0 :true 
1 :true 
2 :true 
3 :true 
...

这很奇怪 - 我希望连续的锁失败,因为 s 永远不会解锁。

这里有什么见解吗?

【问题讨论】:

  • 您是否阅读过 ReentrantLock 的文档? docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/…
  • 线索就在名字里:reentrant
  • 所有锁都是在同一个线程中获取的,所以是正确的。这就是 ReentrantLock 的设计。当您尝试在其他线程中锁定时,它将是错误的

标签: java multithreading locking reentrancy


【解决方案1】:

Javadoc is your friend。你真的应该读它。

来自:ReentrantLock.lock()

如果当前线程已经持有锁,那么持有计数加一并且方法立即返回。

【讨论】:

    【解决方案2】:

    我敢打赌,您会一遍又一遍地从同一个线程锁定它。在这种情况下,线程已经拥有锁,所以锁被成功获取(因为它甚至不必被获取)。

    ReentrantLock 由上次成功锁定但尚未解锁的线程拥有。当锁不被另一个线程拥有时,调用锁的线程将返回,成功获取锁。如果当前线程已经拥有锁,该方法将立即返回。这可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法进行检查。

    http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html

    【讨论】:

      【解决方案3】:

      ReentrantLock专门设计成同一个线程可以多次获得锁。这就是“可重入”的意思。从一开始就是为了表现出这种行为。

      【讨论】:

      • 真正的“可重入”意味着线程安全或更具体地说它可以重新进入。 en.wikipedia.org/wiki/Reentrancy_(computing)
      • en.wikipedia.org/wiki/Reentrant_mutex "在计算机科学中,可重入互斥锁是一种互斥、递归锁机制。在可重入互斥锁中,同一个线程可以多次获取锁。"
      • 这是“Reentrant_mutex”的定义。我只是评论说“可重入”这个词与线程多次获得锁无关。
      【解决方案4】:

      它总是返回真,因为只有一个线程,如果 thread1 找到 s.lock()s.tryLock() 它只会增加保持计数,如果另一个线程将尝试执行此代码,则方法 s.tryLock() 将返回 false,因为锁是由 thread1 获取的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-06
        • 2017-12-14
        • 2012-02-20
        • 2020-02-09
        • 1970-01-01
        • 2018-01-19
        • 2018-03-26
        • 1970-01-01
        相关资源
        最近更新 更多