5

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

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

public void display(String msg)    
{    
    synchronized(msg)    
    {    
        for(int i=1;i<=20;i++)    
          {    
               System.out.println("Name= "+msg);    
          }  
    }   
}
  • +1 за упоминание эффекта равенства объектов Java

    от
  • Ну ... в одном случае вы используете переданный в объекте монитор. В другом ... вы используете монитор экземпляра.

    от Brian Roach
  • Увидетьstackoverflow.com/questions/574240/…

    от Matt Ball
  • 13

    Метод

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

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

  • 6

    означает только блокировку на этом экземпляре объекта. Если у вас есть

    synchronized(this)
    

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

    synchronized(msg) 
    

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

  • 0

    if the in the following code the synchronized code will restrict

    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" не мешая друг другу.