gpt4 book ai didi

java - 可重入 tryLock() 在多线程环境中不加锁

转载 作者:太空宇宙 更新时间:2023-11-04 11:10:24 26 4
gpt4 key购买 nike

这是关于可重入锁中的 tryLock() 方法。我正在运行下面的示例代码。我知道这段代码会陷入死锁。

import java.util.concurrent.locks.ReentrantLock;
public class TestMain {
public static void main(String[] args) {
ReentrantLock rl=new ReentrantLock();
S t1=new S(rl);
S t2=new S(rl);
Thread t=new Thread(t1);
Thread u=new Thread(t2);
t.start();
u.start();
}
}
class S extends Thread{
ReentrantLock rl;
S(ReentrantLock r){
rl=r;
}
public void run(){
System.out.println("Entry--");
rl.tryLock();
System.out.println("locked1 "+rl.getHoldCount()+" "+Thread.currentThread().getName());
rl.lock();
System.out.println("locked2 "+rl.getHoldCount()+" "+Thread.currentThread().getName());
rl.unlock();
System.out.println("unlocked "+rl.getHoldCount()+" "+Thread.currentThread().getName());
}
}

但我的问题是,为什么 rl.tryLock() 语句之后的语句也为第二个线程运行。输出如下

Entry--
Entry--
locked1 0 Thread-3
locked1 1 Thread-2
locked2 2 Thread-2
unlocked 1 Thread-2

我认为这一行不应该被打印

"locked2 2 Thread-2"

最佳答案

lock 一样,tryLock 也必须与unlock 配对(如果它返回true)。使用 tryLock 时,您必须检查返回值并解锁是否已锁定,否则它将永远不会完全解锁。

当它打印时,会出现以下序列:[注意,这是一个可能的序列,可以重新排列 5 到 8 之间的序列,因为涉及多个线程,但它仍然是正确的]

  1. [Thread-2] System.out.println("Entry--");
  2. [Thread-3] System.out.println("Entry--");
  3. [Thread-2] rl.tryLock(); [r1 现已锁定到 Thread-2,count=1]
  4. [Thread-3] rl.tryLock(); [r1 已锁定,返回 false]
  5. [Thread-3] System.out.println("locked1 "+rl.getHoldCount()+""+Thread.currentThread().getName()); [r1 未保留,因此计数为 0]
  6. [Thread-2] System.out.println("locked1 "+rl.getHoldCount()+""+Thread.currentThread().getName()); [r1 持有,count=1]
  7. [Thread-3] rl.lock(); [r1 已锁定,阻塞]
  8. [Thread-2] r1.lock(); [r1 已持有,count=2]
  9. [Thread-2] System.out.println("locked2 "+rl.getHoldCount()+""+Thread.currentThread().getName());
  10. [Thread-2] rl.unlock(); [r1 已持有,count=1]
  11. [Thread-2] System.out.println("已解锁 "+rl.getHoldCount()+""+Thread.currentThread().getName());

打印行“locked2 2 Thread-2”是因为可重入锁可以被锁定多次如果被持有者锁定。因此 tryLocklock 都会成功,但您只解锁其中一个,因此另一个线程永远阻塞。

关于java - 可重入 tryLock() 在多线程环境中不加锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46082765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com