gpt4 book ai didi

java - java线程死锁

转载 作者:行者123 更新时间:2023-12-02 03:27:43 24 4
gpt4 key购买 nike

我是线程新手,并提出了一个死锁示例。我尝试重现死锁场景,但代码运行良好,没有任何问题。

请指导一下我哪里错了。下面是代码片段

package Practice;

public class Deadlock {

public static void main(String[] args) {

Deadlock a = new Deadlock();
Threadslock first = new Threadslock(a);
Threadslock second = new Threadslock(a);
first.setName("First");
second.setName("Second");
first.start();
second.start();

}

}

class Threadslock extends Thread
{
Deadlock lock ;
private String anotherLock = "";
Threadslock(Deadlock lo)
{
lock = lo;
}
public void run()
{

if(getName().equals("First"))
{
synchronized(lock)
{
synchronized(anotherLock)
{
try
{
Thread.sleep (2000);
}
catch(InterruptedException r)
{

}
System.out.println("First Thread");
System.out.println("Next Step in First");
}
}
}
else
{
synchronized(anotherLock)
{
synchronized(lock)
{
try{
Thread.sleep (2000);
}
catch(Exception e)
{

}

System.out.println("Second Thread");
System.out.println("Next Step in Second");
}
}
}
}
}

输出如下:

第一个线程
第一步的下一步

第二个线程
第二步下一步

最佳答案

正如 @Sean Bright 所建议的,您在错误的位置添加了 sleep 。

此外,两个线程中都有两个 anotherLock 实例,它永远不会死锁,因为第一个线程和第二个线程都可以获得自己的 anotherLock。所以必须让两个线程共享同一个anotherLock。

请检查以下代码,希望对您有所帮助。

public class Deadlock {

public static void main(String[] args) {

Deadlock a = new Deadlock();
String anotherLock = "";
Threadslock first = new Threadslock(a,anotherLock);
Threadslock second = new Threadslock(a,anotherLock);
first.setName("First");
second.setName("Second");
first.start();
second.start();

}

}

class Threadslock extends Thread
{
Deadlock lock ;
String anotherLock;
Threadslock(Deadlock lo, String anotherLock)
{
lock = lo;
this.anotherLock = anotherLock;
}
public void run()
{

if(getName().equals("First"))
{
synchronized(lock)
{
System.out.println("First Thread");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(anotherLock)
{
try
{
Thread.sleep (2000);
}
catch(InterruptedException r)
{

}
System.out.println("Next Step in First");
}
}
}
else
{
synchronized(anotherLock)
{
System.out.println("Second Thread");
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
synchronized(lock)
{
try{
Thread.sleep (2000);
}
catch(Exception e)
{

}
System.out.println("Next Step in Second");
}
}
}
}
}

关于java - java线程死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38589250/

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