Вопрос по java – Синхронизированные блоки и объекты мониторинга

5

Привет может кто-то объяснить, если в следующем коде синхронизированный код ограничит доступ к потокам. Если да, то чем он отличается от того, использовали ли мы «это»? в качестве объекта монитора вместо "msg".

public void display(String msg)    
{    
    synchronized(msg)    
    {    
        for(int i=1;i<=20;i++)    
          {    
               System.out.println("Name= "+msg);    
          }  
    }   
}
Ну ... в одном случае вы используете переданный в объекте монитор. В другом ... вы используете монитор экземпляра. Brian Roach
Увидетьstackoverflow.com/questions/574240/… Matt Ball

Ваш Ответ

3   ответа
13

Метод, который вы написали, будет блокироваться, только если два потока вызовут этот метод с одинаковымmsg объект.

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

6

synchronized(this)

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

synchronized(msg) 

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

+1 за упоминание эффекта равенства объектов Java
0

access to the threads

Да. Блок не может быть вызван одновременно более одного раза на одном и том жеString объект [и на самом деле, все блоки, которые синхронизированы на этомString объект].

how is it different from, if we have used "this" as a monitor object instead of "msg"

synchronized(this) предотвращает одновременный доступ ко всем блокам одним и тем же объектом, в данном случае объектом, который являетсяthis метода, не сможет войти в синхронизированный блок дважды.

for example [используя java-подобный псевдокод]:

s1 = s2;
Thread1:
MyObject o = new MyObject();
o.display(s1);
Thread2:
MyObject o = new MyObject();
o.display(s2);

Текущий метод не позволит блоку быть вызванным одновременно Thread1 и Thread2

Тем не мение:

MyObject o = new MyObject();
Thread1:
o.display("s1");
Thread2:
o.display("s2");

Между ними не будет отображаться поведение блокировки - монитор отслеживается каждым "s1" и "s2" не мешая друг другу.

Похожие вопросы