我创建了一个对象列表以及参数发送的线程列表是列表中的随机对象。创建线程后,线程应锁定参数中传递的对象。但是,虽然我在创建线程后将线程设置为休眠以形成死锁。似乎没有形成任何僵局。基于谷歌的一些研究,我了解到java中的对象是通过引用传递的,但是我不确定为什么它不能在这里工作。
for(int i=0;i<5;i++){
Object tempObject = new Object();
objectList.add(tempObject);
}
Random rand = new Random();
for(int i =0;i<5;i++){
for(int j =0;j<10;j++){
int random = rand.nextInt(objectList.size());
CustomThread ct = new CustomThread(i,objectList.get(random));
ct.start();
System.out.println();
}
try {
detectDeadlock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void detectDeadlock() throws InterruptedException {
while(true){
ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
long[] threadIds = threadBean.findDeadlockedThreads();
int deadlockedThreads = threadIds != null? threadIds.length : 0;
System.out.println("Number of deadlocked threads: " + deadlockedThreads);
TimeUnit.MILLISECONDS.sleep(1000);
}
}
CustomThread.java
NewThread(int processID, Object tObject) {
this.pid = processID;
this.object = tObject;
}
@Override
public void run() {
synchronized (this.object) {
Random rand = new Random();
System.out.println("Holding an object");
try { TimeUnit.MILLISECONDS.sleep(rand.nextInt(10000)); }
catch (InterruptedException e) {}
}
}
答案 0 :(得分:1)
这里发生的是你有5个CustomThread实例,每个实例获得一个唯一的对象,锁定它,然后进入睡眠状态。其他5个线程获取一个已经在使用的对象,因此当他们的CustomThread尝试锁定它时,它们必须等待最多。第一个线程完成10秒。此时,第二个线程能够锁定对象,并且确实如此。
你对Random的使用意味着它并不是第一个获得一个独特的对象而第二个没有,但基本的想法是相同的,第二个CustomThread只是等待第一个完成
如果你想创建一个真正的死锁,你需要第一个持有锁的线程需要来自等待锁的第二个线程的东西。它需要是循环依赖,线程A在线程B上等待,同时线程B在线程A上等待。在您的情况下,您只有线程B在线程A上等待。
找到一个可能指向如何创建死锁的问题;