5

我看到这个:

// 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 代码中找到了这个金块。

4

5 回答 5

7

是的,没关系。同步语句将获取它锁定的引用的副本,并使用该副本来计算最后要解锁的内容。

Java 语言规范的第 14.19 节实际上并不清楚这一点,但它确实声明了表达式在开始时被评估 - 并且没有提到稍后再次评估它。

于 2010-11-19T16:07:24.143 回答
3

有一个区别:

synchronized( this.thread )

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

this.thread = null;

您正在重新分配该字段。你没有对上面引用的对象做任何事情,所以锁仍然有效。

于 2010-11-19T16:08:32.380 回答
1

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

于 2010-11-19T17:57:09.107 回答
0

你可以做到,但几乎可以肯定,无论它试图实现什么,代码都是错误的。贴出整个代码,我保证很明显是程序员不懂并发。

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

于 2010-11-19T17:15:42.510 回答
0

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

于 2010-11-19T17:53:56.550 回答