繁体   English   中英

这个可以吗? 在同步块中同步(线程),然后执行thread = null

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM