Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Renentrant tryLock()在多线程环境中未锁定_Java_Reentrantlock - Fatal编程技术网

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之间可以重新排列,因为涉及多个线程,并且仍然正确]

  • [Thread-2]
    System.out.println(“条目--”)
  • [Thread-3]
    System.out.println(“条目--”)
  • [Thread-2]
    rl.tryLock()[r1现在锁定到线程2,计数=1]
  • [Thread-3]
    rl.tryLock()[r1已锁定,返回false]
  • [Thread-3]
    System.out.println(“locked1”+rl.getHoldCount()+“”+Thread.currentThread().getName())[r1未保持,因此计数为0]
  • [Thread-2]
    System.out.println(“locked1”+rl.getHoldCount()+“”+Thread.currentThread().getName())[r1保持,计数=1]
  • [Thread-3]
    rl.lock()[r1已锁定,块]
  • [Thread-2]
    r1.lock()[r1保持,计数=2]
  • [Thread-2]
    System.out.println(“locked2”+rl.getHoldCount()+“”+Thread.currentThread().getName())
  • [Thread-2]
    rl.unlock()[r1保持,计数=1]
  • [Thread-2]
    System.out.println(“解锁”+rl.getHoldCount()+“”+Thread.currentThread().getName())

  • 打印行
    “locked2 2 Thread-2”
    ,因为如果由支架锁定,则可多次锁定重入式锁。因此
    tryLock
    lock
    都成功,但您只解锁其中一个线程,因此其他线程将永远阻塞。

    lock
    类似,
    tryLock
    如果返回
    true
    ,则必须与
    unlock
    配对。使用
    tryLock
    时,必须检查返回值,如果它已锁定,则必须解锁,否则它将永远无法完全解锁

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

  • [Thread-2]
    System.out.println(“条目--”)
  • [Thread-3]
    System.out.println(“条目--”)
  • [Thread-2]
    rl.tryLock()[r1现在锁定到线程2,计数=1]
  • [Thread-3]
    rl.tryLock()[r1已锁定,返回false]
  • [Thread-3]
    System.out.println(“locked1”+rl.getHoldCount()+“”+Thread.currentThread().getName())[r1未保持,因此计数为0]
  • [Thread-2]
    System.out.println(“locked1”+rl.getHoldCount()+“”+Thread.currentThread().getName())[r1保持,计数=1]
  • [Thread-3]
    rl.lock()[r1已锁定,块]
  • [Thread-2]
    r1.lock()[r1保持,计数=2]
  • [Thread-2]
    System.out.println(“locked2”+rl.getHoldCount()+“”+Thread.currentThread().getName())
  • [Thread-2]
    rl.unlock()[r1保持,计数=1]
  • [Thread-2]
    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之后才一直等待