[英]Is this ok? Synchronized( thread ), then thread=null in the synch block
我看到了这个:
// thread is a member of this class
synchronized( this.thread )
{
this.thread.running = false;
this.thread.notifyAll(); // Wake up anything that was .waiting() on
// the thread
this.thread = null; // kill this thread reference.
// can you do that in a synchronized block?
}
是否可以设置thread=null
同时仍保持锁定?
我在一些BB代码中找到了这个金块。
是的,没关系。 synchronized语句将获取其锁定的引用的副本,并使用该副本计算出最后解锁的内容。
Java语言规范的第14.19节实际上并不清楚这一点,但它确实声明表达式在开始时进行了评估 - 并且未提及稍后再次对其进行评估。
有区别:
synchronized( this.thread )
您正在对象上同步this.thread
指向的字段
this.thread = null;
你正在重新分配这个领域。 您没有对上面引用的对象执行任何操作,因此锁定仍然有效。
同步表达式在输入时被解除引用,因此此锁的任何后续用户都将获得NullPointerException。 您可以通过在同步块之前放置一个空检查来解决这个问题,但之后您已经引入了竞争条件。
你可以做到这一点,但几乎可以肯定,代码对于它想要实现的任何东西都是错误的。 发布整个代码,我保证显然程序员不懂并发。
不要重新分配用于同步的变量。
如果您还有一个为线程分配新值的块,则只会出现问题。 在这种情况下,您有一个竞争条件,因为两个块不会锁定同一个对象,但会更新相同的字段,并且它将随机分配最后一个值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.