我明白这一点:
// 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代码中找到了这个金块。
答案 0 :(得分:7)
是的,没关系。 synchronized语句将获取其锁定的引用的副本,并使用该副本计算出最后解锁的内容。
Java语言规范的Section 14.19实际上并不清楚这一点,但它确实声明表达式在开始时被评估 - 并且未提及稍后再次对其进行评估上。
答案 1 :(得分:3)
有区别:
synchronized( this.thread )
您正在对象上同步字段this.thread
指向
this.thread = null;
你正在重新分配这个领域。您没有对上面引用的对象执行任何操作,因此锁定仍然有效。
答案 2 :(得分:1)
同步表达式在输入时被取消引用,因此此锁的任何后续用户都将获得NullPointerException。您可以通过在同步块之前进行空检查来解决此问题,但之后您已经引入了竞争条件。
答案 3 :(得分:0)
你可以做到,但几乎可以肯定的是,代码对于它想要实现的任何东西都是错误的。发布整个代码,我保证程序员显然不了解并发性。
不要重新分配用于同步的变量。
答案 4 :(得分:0)
如果您还有一个为线程分配新值的块,则只会出现问题。在这种情况下,您有一个竞争条件,因为两个块不会锁定同一个对象,但会更新相同的字段,并且它将随机分配最后一个值。