Базовая синхронизация Java - PullRequest
0 голосов
/ 14 июля 2011

У меня вопрос, в чем разница между

StringBuilder sb = new StringBuilder();
public void sync(){
  synchronized(sb){
  };
}

и

public void sync(){
  synchronized(this){
  };
}

Ответы [ 3 ]

6 голосов
/ 14 июля 2011

В первом случае вы блокируете переменную "sb", а во втором - в объекте "this".Это очевидно, но я предполагаю, что вы хотите знать , что лучше .

Ну, первый случай лучше, потому что вы блокируете локальную переменную (рассмотрите возможность сделать ее закрытой) иВы совершенно уверены, что никто другой не сможет заблокировать это, кроме вас.Если вы заблокируете «this», любой другой поток может использовать этот объект для блокировки, не позволяя вам запустить синхронизированный код (тогда как вы можете безопасно).

0 голосов
/ 14 июля 2011

В java синхронизация выполняется по концепции, называемой monitor .Аргументом synchronized является то, какой монитор вы блокируете.

0 голосов
/ 14 июля 2011

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

Просто в первом случае ссылка является sb, иво втором случае это this.Значение this является просто ссылкой, как и любая другая (за исключением гарантированного, что она не будет нулевой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...