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

时间:2010-11-19 16:04:56

标签: java blackberry synchronized-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代码中找到了这个金块。

5 个答案:

答案 0 :(得分:7)

是的,没关系。 synchronized语句将获取其锁定的引用的副本,并使用该副本计算出最后解锁的内容。

Java语言规范的

Section 14.19实际上并不清楚这一点,但它确实声明表达式在开始时被评估 - 并且未提及稍后再次对其进行评估上。

答案 1 :(得分:3)

有区别:

synchronized( this.thread )

您正在对象上同步字段this.thread指向

this.thread = null;

你正在重新分配这个领域。您没有对上面引用的对象执行任何操作,因此锁定仍然有效。

答案 2 :(得分:1)

同步表达式在输入时被取消引用,因此此锁的任何后续用户都将获得NullPointerException。您可以通过在同步块之前进行空检查来解决此问题,但之后您已经引入了竞争条件。

答案 3 :(得分:0)

你可以做到,但几乎可以肯定的是,代码对于它想要实现的任何东西都是错误的。发布整个代码,我保证程序员显然不了解并发性。

不要重新分配用于同步的变量。

答案 4 :(得分:0)

如果您还有一个为线程分配新值的块,则只会出现问题。在这种情况下,您有一个竞争条件,因为两个块不会锁定同一个对象,但会更新相同的字段,并且它将随机分配最后一个值。