2009-11-02 6 views
1

Быстрый вопрос. Я довольно новичок в потокобезопасном программировании, и мне было интересно, есть ли у меня что-то вроде ниже, будет ли это безопасным от тупика после компиляции и запуска?Синхронизация в Java

public class Foo 
{ 
    protected CustomClass[] _mySynchedData = new CustomClass[10]; 

    public void processData() 
    { 
     synchronized(_mySynchedData) { 
      // ...do stuff with synched variable here 
     } 
    } 
} 


public class Bar extends Foo 
{ 

    @Override 
    public void processData() 
    { 
     synchronized(_mySynchedData) { 
      // perform extended functionality on synched variable here 

      // ...then continue onto parent functionality while keeping synched 
      super.processData(); 
     } 
    } 
} 



Bar testObj = new Bar(); 

// Deadlock? 
testObj.processData(); 

Любое понимание было бы весьма полезным.

ответ

6

Ваш код отображает только одну тему.

С одной нитью вы не можете зайти в тупик.


Язык Java поддерживает то, что они официально называют reentrant synchronization. В основном это означает, что один поток может восстановить блокировку, которой он уже владеет.

+0

На самом деле, если это _didn't_ поддерживает вложенность (и не все блокировки), я бы очень назвал это тупиком, хотя бы был задействован только один поток. – SoftMemes

+0

Спасибо за информацию и ссылку! –

4

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

1

RichN верен тем, что ваш код содержит только один поток, и, следовательно, взаимоблокировка невозможна. Также обратите внимание, что для возникновения тупика вам необходимо иметь несколько потоков, получающих несколько замков (хотя в разный заказ) для возникновения тупика.

Ваш код в настоящее время ссылается только на одну блокировку: связанную с _mySynchedData. Тот факт, что вы пытаетесь заблокировать его дважды, не имеет значения, так как блокировки в Java: reentrant.

5

Ваш вопрос - это то, что происходит, когда вы синхронизируете два раза на одном и том же объекте.

Ответ: Java сначала проверит, какой поток принадлежит монитору (это внутренняя структура данных, на которой работает). Поскольку поток владельца совпадает с текущим потоком, Java продолжит работу.

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