一个线程持有对象的监视器时,是否有任何保证该对象不会被垃圾回收?
例如:
class x {
private WeakReference<Object> r;
Object getMonitorObject() {
Object o = new Object();
r = new WeakReference<>(o);
return o;
}
void thread1() throws Exception {
synchronized (getMonitorObject()) {
Thread.sleep(3000);
}
}
void thread2() {
Object b = r.get();
}
}
在这种情况下,如果在调用
thread2()
时另一个线程正在thread1()
中睡眠,是否有保证b
不会为空? 假设在不同的线程中睡眠thread1()
期间执行了整个thread2()
。
synchronized
块的目标必须被视为“强引用”,但这一暗示是清晰的,实际上也是如此。这段代码中唯一的问题在于WeakReference r
需要是volatile
(或使用其他内存屏障)以确保分配的值对第二个线程可见。 - ericksonjava.lang.ref
包文档,但我没有考虑到终结器的后果(现在不鼓励使用它)。 - erickson