【发布时间】:2020-11-04 08:18:04
【问题描述】:
java 线程如何在同步块中使用的监视器或同步方法中使用的监视器上获取锁?
我在多篇文章中读到,在偏向锁定的情况下,此信息使用 CAS 操作存储在对象标头中,在竞争情况下,使用等待设置队列/监控队列,但最终锁定仅标记在对象标头中。 如果是这种情况,那么锁是如何释放的?如何将对象标记为空闲以获取另一个线程的锁?内部是否使用了等待和通知方法?如果是这种情况,那么为什么在同步块内设置监视器 null 不会引发任何异常。
下面的例子工作得很好,我期待 NullPointerException 假设同步块的结尾会尝试标记锁属性以释放锁。
例子:
Object monitor = new Object();
synchronized (monitor){
System.out.println("before null");
monitor =null;
System.out.println("after null");
}
System.out.println("successfully Exited");
【问题讨论】:
-
请注意
monitor是一个变量。它存储对 object 的引用。将引用更改为指向null不会删除对象或其他内容。 -
@akuzminykh 如果我的方法运行时间很长并且触发器 GC 将监控成为有资格收集?那会触发 NPE 吗?
-
更新:因此监视器将不符合 GC 的条件,因为它仍被 synchronized 构造后面的代码引用。 @pveentjer 的回答更清楚了。
标签: java multithreading synchronization locking