gpt4 book ai didi

Java死锁挑衅

转载 作者:行者123 更新时间:2023-12-01 16:41:48 24 4
gpt4 key购买 nike

我正在用java做一些练习(你们中的一些人可能会猜想代码来自哪里)。我尝试使用以下代码引发死锁情况:

class Resource {

public Integer value = 42;
}

public class DeadLockRisk implements Runnable {

private Resource resourceA = new Resource();
private Resource resourceB = new Resource();

public void write(int a, int b) {

System.out.println(Thread.currentThread().getName() + " try write Lock A");

synchronized(resourceA) {

System.out.println(Thread.currentThread().getName() + " write Lock A");
System.out.println(Thread.currentThread().getName() + " try write Lock B");

synchronized(resourceB) {

System.out.println(Thread.currentThread().getName() + " write Lock B");

resourceA.value = a;
resourceB.value = b;
//sit on it!
//try { Thread.sleep(5000); } catch (Exception e) {}

System.out.println(Thread.currentThread().getName() + " release write B");
}
System.out.println(Thread.currentThread().getName() + " release write A");
}
}

public int read() {

Integer retVal;
System.out.println(Thread.currentThread().getName() + " try read Lock B");

synchronized(resourceB) {

System.out.println(Thread.currentThread().getName() + " read Lock B");
System.out.println(Thread.currentThread().getName() + " try read Lock A");

synchronized(resourceA) {

System.out.println(Thread.currentThread().getName() + " read Lock A");
retVal = resourceB.value + resourceA.value;
System.out.println(Thread.currentThread().getName() + " release read A");
}
System.out.println(Thread.currentThread().getName() + " release read B");
}
return retVal;
}

public void run() {


if (Thread.currentThread().getName().equals("Thread-1")) {
write(1,2);
}

System.out.println(read());
}

public static void main(String[] args) {

Thread ta = new Thread(new DeadLockRisk());
Thread tb = new Thread(new DeadLockRisk());
ta.start(); tb.start();
}
}

(javac -版本 javac 1.6.0_0uname -a Linux inspiron 2.6.29 #1 SMP 5 月 16 日星期六 10:56:17 CEST 2009 i686 GNU/Linux)

并获取(在其他情况下)以下输出:

Thread-1 try write Lock AThread-0 try read Lock BThread-1 write Lock A      <=====Thread-0 read Lock BThread-1 try write Lock BThread-0 try read Lock AThread-1 write Lock BThread-0 read Lock A       <=====Thread-1 release write BThread-0 release read AThread-1 release write AThread-0 release read BThread-1 try read Lock B154Thread-1 read Lock BThread-1 try read Lock AThread-1 read Lock AThread-1 release read AThread-1 release read B3

我看到了什么错误?在线程 1 释放锁之前,线程 0 如何进入 read() 中的临界区并获得 A 上的锁。这可能是因为输出不同步吗?此代码永远不会发生死锁。

最佳答案

您将不同的 DeadLockRisk 实例传递给两个线程,因此它们在同一对象上不会同步。

关于Java死锁挑衅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1150209/

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