Что означает выражение ссылки на объект в синхронизированном блоке

Может кто-нибудь объяснить мне, что подразумевается под выражением ссылки на объект в данном блоке?

synchronized (object reference expression) {   
  //code block   
}  

public class DeadlockExample {  
  public static void main(String[] args) {  
    final String resource1 = "ratan jaiswal";  
    final String resource2 = "vimal jaiswal";  
    // t1 tries to lock resource1 then resource2  
    Thread t1 = new Thread() {  
      public void run() {  
          synchronized (resource1) {  
           System.out.println("Thread 1: locked resource 1");  

           try { Thread.sleep(100);} catch (Exception e) {}  

           synchronized (resource2) {  
            System.out.println("Thread 1: locked resource 2");  
           }  
         }  
      }  
    };  

    // t2 tries to lock resource2 then resource1  
    Thread t2 = new Thread() {  
      public void run() {  
        synchronized (resource2) {  
          System.out.println("Thread 2: locked resource 2");  

          try { Thread.sleep(100);} catch (Exception e) {}  

          synchronized (resource1) {  
            System.out.println("Thread 2: locked resource 1");  
          }  
        }  
      }  
    };  


    t1.start();  
    t2.start();  
  }  
}  

как здесь, что делает resource1 в синхронизированном блоке здесь?

3 ответа

Короче говоря, объекты могут использоваться в качестве взаимных исключающих блокировок. При наличии одного объекта (такого как resource1) не более одного потока может находиться внутри синхронизированного блока на одном и том же экземпляре ресурса. Другие ожидающие потоки будут ждать, пока первый поток не выйдет из блока.

Этот объект имеет различные методы для этой синхронизации, такие как "ожидание" и "уведомление", используемые для дальнейшего расширения поддержки синхронизации. Поток внутри блока синхронизации объекта может вызывать "wait", чтобы снять блокировку, и ждать, пока другой поток не вызовет "notify" или "notifyAll" для того же объекта. Когда этот поток затем проснется, он попытается повторно получить блокировку, представленную этим объектом. Это полезно для записи условных переменных / мониторов.

Вы пишете программу для симуляции тупика.. как это работает?

public class DeadlockExample {  
  public static void main(String[] args) {  
    final String resource1 = "ratan jaiswal";  
    final String resource2 = "vimal jaiswal";  
    // t1 tries to lock resource1 then resource2  
    Thread t1 = new Thread() {  
      public void run() {  
          synchronized (resource1) {  //try to get lock on String resource1, no toher thread can access resource1 until this synchronized block ends (provided you've indeed entered this block by acquiring the lock..)
           System.out.println("Thread 1: locked resource 1");  

           try { Thread.sleep(100);} catch (Exception e) {}  //sleep() doesn't release the lock

           synchronized (resource2) {  //try to get lock on string get lock on String resource2 
            System.out.println("Thread 1: locked resource 2");  
           }  
         }  
      }  
    };  

    // t2 tries to lock resource2 then resource1  
    Thread t2 = new Thread() {  
      public void run() {  
        synchronized (resource2) {  //try to get lock on String resource2
          System.out.println("Thread 2: locked resource 2");  

          try { Thread.sleep(100);} catch (Exception e) {}  //sleep() doesn't release the lock

          synchronized (resource1) {  //try to get lock on String resource1
            System.out.println("Thread 2: locked resource 1");  
          }  
        }  
      }  
    };  


    t1.start();  
    t2.start();  
  }  
}

Синхронизация должна использоваться для объекта или методов, а не для переменных. Вы использовали это неправильно. Синхронизация объекта означает, что у вас будет блокировка объекта. Другие потоки не имеют доступа. Как только обработка завершена, блокировка снята.

Другие вопросы по тегам