2016-01-28 5 views
0

Мне любопытно, что произойдет, если код будет выглядеть как-то внизу. Означает ли это, что каждый объект в каждом созданном потоке синхронизирован?синхронизация вне темы

public synchronized void go() { 
    try { 
     while(true) { 
      //waiting for a new connection 
      new Thread(client).start(); 
     } 
    } catch (IOException e) { 
    } 
} 
+1

Вы ** ** ** вне темы. –

+0

Скомпилирует ли это? Откуда возникает IOException? Как '1' является логическим выражением? – Thilo

+0

Обратите внимание, что 'while (1)' не будет компилироваться. По крайней мере, на Java. – EJK

ответ

0

Означает ли, что каждое действие в каждой созданной нити синхронизируется?

No. Метод start в новом потоке возвращается сразу после запуска новой нити. Затем вызывающий поток выходит из синхронизированного метода, поэтому блокировка синхронизации освобождается.

EDIT: Я вижу, вы редактировали вопрос, чтобы добавить цикл while (1). Я предполагаю, что вы имели в виду while (true) BTW. Это меняет мое объяснение тем, что вызывающий поток никогда не покидает синхронизированный метод. Но ответа все равно нет. Как указывает Тило в комментарии ниже, новый поток не имеет никакого отношения к этой блокировке.

Вызывающий поток владеет блокировкой, созданной синхронизированным блоком. Пока этот поток выполняет код в рамках этого блока, он сохранит блокировку, и, таким образом, ни один другой поток не может войти в блок. В вашем примере создается новый объект потока и вызывается метод start. Этот метод запускает выполнение потока, вызывая его метод run, который выполняется в новом контексте потока. Поскольку это новый контекст потока, он считается вне области синхронизированного блока вызывающего потока. Таким образом, новый поток не блокируется, и новый поток не содержит никаких синхронизированных блоков кода по умолчанию.

+0

И даже если он не оставил метод, но цикл навсегда, удерживая блокировку, порожденный поток не имеет никакого отношения к этой блокировке. – Thilo

+0

Хорошая точка. Не возражаете, если я добавлю это к моему ответу? – EJK

+0

На самом деле, в обновленном вопросе он делает именно это (вероятно, заканчивается память перед чем-то еще ...) – Thilo

0

Если метод является синхронным вызовом, действия будут синхронизированы. Если метод представляет собой асинхронный вызов, действия не будут синхронизированы.

В этом случае метод запуска асинхронный, действия не будут синхронизированы.

+0

В Java нет такой функции, как вызов асинхронного метода. – EJP

+0

Я имею в виду виды потоков делегатов (методы обратного вызова и т. Д.) –

+0

Как это может повлиять на работу ключевого слова 'synchronized'? Ваш ответ не имеет смысла. – EJP

Смежные вопросы