2012-07-07 3 views
0

Я хотел бы лучше понять механику того, что на самом деле происходит, когда поток входит в блок synchronized(this) против блока synchronized(someObjectReference).Различия между синхронизированными (это) и синхронизированными (objectReference)

synchronized (this) { 
     // Statement 1 
     // Statement 2 
    } 

    synchronized (someObjectReference) { 
     // Statement 1 
     // Statement 2 
    } 

Как я понимаю: (? Я упускаю что-то я не прав)

  • В обоих случаях, только один поток может получать доступ синхронизируется поблочно
  • Когда мы «повторно синхронизировать на someObjectReference:
    • только один поток одновременно может получить доступ к/изменить его в этом блоке
    • только 1 поток в то время, может войти в этот блок

Какие механики есть пожалуйста?

synchronized (objectReference) { 
     // Statement 1 dealing with someObjectReference 
     // Statement 2 not dealing with someObjectReference 
    } 

В приведенном выше примере, это имеет какой-либо смысл долить заявления не касающиеся mutex в синхронизированный блок?

ответ

1

Там только разница, когда вы смешиваете два вместе.

Единственное основное правило synchronized(foo) состоит в том, что только один поток может быть в блоке synchronized(foo) для того же foo в любой момент времени. Это это. (Единственное предостережение, может быть, стоит отметить, что поток может быть внутри несколько вложенных synchronized(foo) блоков для одной и той же foo.)

Если некоторый код находится внутри synchronized(foo) блока, и некоторый код находится внутри synchronized(bar) блока, то эти части кода может работать одновременно - но вы не можете иметь два потока, выполняющих код в synchronized(foo) блоков одновременно.

+0

Nice и ясно. Спасибо – JAM

0

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

In both cases, only 1 thread can access synchronized block at a time 

--Depend на объекте, чтобы заблокировать доступность

0

В обоих случаях, только один поток может получать доступ синхронизируется поблочно

Не совсем. Например, при синхронизации по «этому» 2 потока могут обращаться к одному и тому же блоку, если у них есть 2 разных экземпляра одного и того же класса. Но да, для одного экземпляра будет только один доступ к блоку. И будет иметься только один доступ к любому синхронизированному блоку на этом

«Синхронизированный» означает, что только один поток может иметь доступ к любому синхронизированному блоку в том же экземпляре.Поэтому, если у вас есть 2 синхронизированных блока в 2 разных исходных файлах, но в одном экземпляре, если один поток находится внутри одного из этих блоков, другой поток не может получить доступ к обоим синхронизированным блокам

О «что делать в синхронизированном блоке ": делать только вещи, связанные с синхронизированным объектом. Любая другая команда, которая не нуждается в синхронизации, блокирует источник информации ни для чего, потенциально создаст узкое место

+0

Да :) Я должен быть более ясным, конечно, я говорил об одном экземпляре класса. Хорошая точка – JAM

0

Важно отметить, что синхронизация на this имеет дело с видимостью. Допустим, у вас есть класс A, и он синхронизируется на this. Любой код, который использует A, имеет ссылку на объект A, используемый для блокировки. Это означает, что пользователь A может создать тупик, если они также заблокируют экземпляр A.

public class A implements Runnable { 
    public void run() { 
    synchronized (this) { 
     // something that blocks waiting for a signal 
    } 
    //other code 
    } 
} 

public class DeadLock { 
    public void deadLock() { 
    A a = new A(); 
    Thread t = new Thread(a); 
    t.start(); 

    Thread.sleep(5000); //make sure other thread starts and enters synchronized block 
    synchronized (a) { 
     // THIS CODE BLOCK NEVER EXECUTES 
     // signal a 
    } 
    } 
} 

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

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