Синхронизация методов, объектов, классов в Java

мне нужно некоторое разъяснение относительно использования synchronization на multi-threaded environment. У меня есть небольшой пример Class ниже. но мне на самом деле трудно сделать тестовый пример того, как будет работать следующее; причина, по которой я хочу тестовый случай, - понять, как synchronization обрабатывает эти различные сценарии


  • если thread звонки SharedResource.staticMethod, оно приобретет lock на class. означает ли это instance of SharedResource, скажем x, придется подождать, пока он получает lock на исполнение x.staticMethod.

  • будет synchronization of this на block, приобретает замок для этого раздела кода или для всего object. Я. e может другой thread называть же method на object; но выполните оставшуюся часть кода, которая не является частью synchronization block

  • если вышеуказанная точка истинна, имея dummy object to lock on не предоставляет никаких дополнительных преимуществ. Правильно?

  • таким образом, существуют различные уровни synchronziations. , и block level. так что это будет означать locks для этих отдельных уровней должны существовать? Если бы я приобрел замок на Object, другой Thread не может вызывать каких-либо methods на same object, а если я приобрел замок на method, другой thread может получить блокировку на другой method. Правильно ли это?

некоторые советы по как создать два потока, которые действуют на один и тот же объект и один и тот же метод, будет полезно (я понимаю, что мне нужно расширить Thread класс или реализация Runnable интерфейс). Но не уверен, как заставить два потока вызывать один и тот же метод на одном объекте.

class SharedResource {
     public Integer x =0;
     public static Integer y=0;
     Object dummy = new Object();
     public Integer z=0;

     public synchronized static void staticMethod(){
         System.out.println("static Method is called");
         y++; 
     }

     public synchronized void incrementX(){
         System.out.println("instance method; incrementX");
         x++;
     }

     public void incrementXBlock(){
         synchronized(this){
             x++;
         }
         System.out.println("instance method; incrementXBlock");
     }

     public void incrementZ(){
         synchronized (dummy) {
             z++;
         } 
         System.out.println("synchronized on dummy; incrementZ method ");
     }
}

public class ThreadSynchronization extends Thread {

}

я читал эти сообщения, но я не уверен, если я понял это ясно.

блокировка синхронизированного метода Java на объекте или методе?, включает ли Java monitor экземпляр переменные?

1 ответов


class SharedResource {
  public synchronized static void staticMethod(){
    System.out.println("static Method is called");
    y++; 
  }
  public synchronized void incrementX(){
     System.out.println("instance method; incrementX");
     x++;
  }
}

тут же

class SharedResource {
  public static void staticMethod(){
    synchronized(SharedResource.class) {
      System.out.println("static Method is called");
      y++;
    }
  }
  public void incrementX(){
    synchronized(this) {
      System.out.println("instance method; incrementX");
      x++;
    }
  }
}

проще говоря, поток, входящий в синхронизированный блок, получит блокировку на указанном объекте в течение всего блока. Это означает, что не более одного потока может выполнить synchronized блок кода для конкретного объекта блокировки. С Class экземпляр и конкретный экземпляр этого класса-разные объекты,synchronized static методы и synchronized методы экземпляра не блокируют друг друга. Но нет никакой разницы между методом " уровень " и "уровень блока"; важным моментом является то, какой объект выбран для синхронизации.