gpt4 book ai didi

java - 从 SCJP 6 书中了解多线程

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:48:13 26 4
gpt4 key购买 nike

以下代码在SCJP6书上

class ThreadA {
public static void main(String [] args) {
ThreadB b = new ThreadB();
b.start();

synchronized(b) {
try {
System.out.println("Waiting for b to complete...");
b.wait();
} catch (InterruptedException e) {}
System.out.println("Total is: " + b.total);
}
}
}

class ThreadB extends Thread {
int total;

public void run() {
synchronized(this) {
for(int i=0;i<100;i++) {
total += i;
}
notify();
}
}
}

前面的代码会不会导致死锁,因为线程 a 和 b 都锁定了 b(在各自的同步块(synchronized block)中)?

我遗漏了一些东西,但不太确定是什么。

最佳答案

最有可能的执行如下:

  • b.start() 和正在执行的 run 方法之间有轻微的延迟
  • 主线程因此设法获取了b上的锁并进入了synchronized block
  • 然后等待 b(释放锁)
  • run 开始执行时,监视器可用(或很快可用),因此它可以进入 synchronized block
  • 完成后通知b它可以停止等待
  • 主线程完成。

但是,根据线程调度,run 并非不可能首先执行,在这种情况下,主线程可能会永远等待 b.wait()。例如,如果您通过在 b.start() 之后插入一个小的 Thread.sleep(100) 来帮助解决这种情况,您应该观察到这种行为。

底线:这是一个可能会遇到 active 问题的臭代码(它本身不是死锁,因为锁是可用的)。

关于java - 从 SCJP 6 书中了解多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15701930/

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