Это нормально?Синхронизировано (поток), затем поток = ноль в блоке синхронизации - PullRequest
5 голосов
/ 19 ноября 2010

Я вижу это:

// 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 ]

7 голосов
/ 19 ноября 2010

Да, все в порядке.Синхронизированный оператор возьмет копию ссылки, на которую он блокируется, и использует копию, чтобы решить, что разблокировать в конце.

Раздел 14.19 спецификации языка Java isn 'На самом деле это не ясно, но действительно заявляет, что выражение вычисляется в начале, и не упоминает его повторную оценку позже.

3 голосов
/ 19 ноября 2010

Есть разница:

synchronized( this.thread )

Вы синхронизируете на объекте поле this.thread указывает на

this.thread = null;

Вы переназначаете поле. Вы ничего не делаете с объектом, на который вы ссылались выше, поэтому блокировка все еще действует.

1 голос
/ 19 ноября 2010

Синхронизированное выражение разыменовывается при вводе, поэтому любые последующие пользователи этой блокировки получат исключение NullPointerException.Вы можете обойти это, поставив нулевую проверку перед синхронизированным блоком, но затем вы ввели условие гонки.

0 голосов
/ 19 ноября 2010

У вас проблема только в том случае, если у вас также есть блок, который присваивает потоку новое значение. В этом случае у вас есть условие гонки, так как два блока не блокируются на одном и том же объекте, но обновят одно и то же поле, и будет случайным в зависимости от того, какой блок назначил значение последним.

0 голосов
/ 19 ноября 2010

Вы можете сделать это, но почти наверняка код неверен для всего, чего он пытается достичь. Разместите весь код, и я гарантирую, что он явно не понимает параллелизм.

Не переназначать переменную, которая используется для синхронизации.

...