gpt4 book ai didi

java - 如果某个线程使对象为 null 而另一个线程在该对象的方法内部,会发生什么

转载 作者:行者123 更新时间:2023-11-29 03:39:22 25 4
gpt4 key购买 nike

假设我有 -

public class ThreadingIssue {
public B b = new B();
}

class B{
private final Object lock = new Object();

public void someMethod(int timeOut){
synchronized(lock){
try{
lock.wait(timeOut);
}catch(Exception e){
}
// some task..
lock.notifyAll();
}
}
}

class Thread1 implements Runnable{
private ThreadingIssue t;

public Thread1(ThreadingIssue issue) {
t = issue;
}

public void run(){
while(true){
t.b.someMethod(5000);
}
}
}

class Thread2 implements Runnable{
private ThreadingIssue t;

public Thread2(ThreadingIssue issue){
t = issue;
}

public void run(){
try{
Thread.sleep(2000);
}catch(Exception e){
}
t.b = null;
}
}

如果 Thread1 在 B 的 someMethod(5000) 中并等待锁定,并且 Thread2 已将 B 的对象设置为 null,会发生什么情况?我不确定 Thread1 是否会抛出哪个异常。有什么帮助吗?

最佳答案

第二个线程持有对其正在运行其方法的对象的引用(否则它将无法运行其实例方法),因此 GC 无法处理该对象,因此不存在异常的可能性。

为了让你的代码更明确,当你这样做的时候

t.b.someMethod(5000)

在 JVM 内部处理 t.b 表达式(这是对对象的引用),因此引用计数不为 0。

关于java - 如果某个线程使对象为 null 而另一个线程在该对象的方法内部,会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13901779/

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