Java Renentrant tryLock()在多线程环境中未锁定
这是关于重入锁中的Java Renentrant tryLock()在多线程环境中未锁定,java,reentrantlock,Java,Reentrantlock,这是关于重入锁中的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=ne
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
如果返回true
,则还必须与unlock
配对。使用tryLock
时,必须检查返回值,如果它已锁定,则必须解锁,否则它将永远无法完全解锁
打印时会出现以下顺序:[注意这是一个可能的顺序,5到8之间可以重新排列,因为涉及多个线程,并且仍然正确]
System.out.println(“条目--”)代码>
System.out.println(“条目--”)代码>
rl.tryLock()代码>[r1现在锁定到线程2,计数=1]
rl.tryLock()代码>[r1已锁定,返回false]
System.out.println(“locked1”+rl.getHoldCount()+“”+Thread.currentThread().getName())代码>[r1未保持,因此计数为0]
System.out.println(“locked1”+rl.getHoldCount()+“”+Thread.currentThread().getName())代码>[r1保持,计数=1]
rl.lock()代码>[r1已锁定,块]
r1.lock()代码>[r1保持,计数=2]
System.out.println(“locked2”+rl.getHoldCount()+“”+Thread.currentThread().getName())代码>
rl.unlock()代码>[r1保持,计数=1]
System.out.println(“解锁”+rl.getHoldCount()+“”+Thread.currentThread().getName())代码>
打印行
“locked2 2 Thread-2”
,因为如果由支架锁定,则可多次锁定重入式锁。因此tryLock
和lock
都成功,但您只解锁其中一个线程,因此其他线程将永远阻塞。与lock
类似,tryLock
如果返回true
,则必须与unlock
配对。使用tryLock
时,必须检查返回值,如果它已锁定,则必须解锁,否则它将永远无法完全解锁
打印时会出现以下顺序:[注意这是一个可能的顺序,5到8之间可以重新排列,因为涉及多个线程,并且仍然正确]
System.out.println(“条目--”)代码>
System.out.println(“条目--”)代码>
rl.tryLock()代码>[r1现在锁定到线程2,计数=1]
rl.tryLock()代码>[r1已锁定,返回false]
System.out.println(“locked1”+rl.getHoldCount()+“”+Thread.currentThread().getName())代码>[r1未保持,因此计数为0]
System.out.println(“locked1”+rl.getHoldCount()+“”+Thread.currentThread().getName())代码>[r1保持,计数=1]
rl.lock()代码>[r1已锁定,块]
r1.lock()代码>[r1保持,计数=2]
System.out.println(“locked2”+rl.getHoldCount()+“”+Thread.currentThread().getName())代码>
rl.unlock()代码>[r1保持,计数=1]
System.out.println(“解锁”+rl.getHoldCount()+“”+Thread.currentThread().getName())代码>
打印行
“locked2 2 Thread-2”
,因为如果由支架锁定,则可多次锁定重入式锁。所以tryLock
和lock
都成功了,但是您只解锁了其中一个线程块,所以其他线程块将永远被锁定。为什么它永远不会被打印出来?对于其中一个线程,tryLock
将成功ReentrantLock
是可重入的,因此该线程的lock
也将成功。之后,保持计数将为2。当使用2个锁和2个线程等待每个锁被对方解锁时,将出现死锁情况。在您的例子中,线程2锁定在rl
上,而线程3在rl.lock()
行中等待r1
,直到从rl.tryLock()得到false之后才一直等待代码>。为什么从来没有打印过?对于其中一个线程,tryLock
将成功ReentrantLock
是可重入的,因此该线程的lock
也将成功。之后,保持计数将为2。当使用2个锁和2个线程等待每个锁被对方解锁时,将出现死锁情况。在您的例子中,线程2锁定在rl
上,而线程3在rl.lock()
行中等待r1
,直到从rl.tryLock()得到false之后才一直等待代码>。