2016-06-14 2 views
0
Public Class A 
{ 
    private Object memberlockObject = new Object(); 

    public doStuffapproach1(){ 

     synchronized(this){ 
       // Do something; 
     } 
    } 

public doStuffapproach2(){ 

     synchronized(memberlockObject){ 
       // Do something; 
     } 
} 

public doStuffapproach3(Object parameterLockObject){ 

     synchronized(parameterLockObject){ 
       // Do something; 
     } 
} 

} 

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

P.S: Я понимаю, что синхронизация уровня метода так же хороша, как и синхронизация всего тела метода (это).

+1

Подсказка: на самом деле вы должны сделать некоторые предварительные исследования, прежде чем задавать вопросы. И хорошо, этот материал действительно документирован повсюду ... а также попытайтесь уменьшить количество используемых вами тегов до необходимого минимума. – GhostCat

ответ

2

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

synchronized(this) использовать текущий объект в качестве монитора

synchronized(otherObject) использовать другой объект в качестве монитора

Если вам нужно синхронизировать на одном объекте в различных классах, по крайней мере один из них должен синхронизировать на что-то другое от this ,

Обратите внимание, что определение метода как synchronized неявно будет синхронизироваться по this (если метод не static).


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

doStuffapproach2 работает точно так же, как doStuffapproach1, потому что вы блокируете объект, который имеет уникальный экземпляр в текущем объекте.

doStuffapproach3 работает по-другому, потому что вы проходите монитор и зависит от того, что вы передаете в качестве параметра.