Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Java의 객체 수준 잠금 대 클래스 수준 잠금?


둘 다 개체 수준 잠금클래스 수준 위치 k는 동기화 를 달성하는 데 사용됩니다. 다중 스레드 응용 프로그램의 메커니즘입니다.

객체 수준 잠금

자바의 모든 개체에는 고유한 잠금이 있습니다. . 스레드가 동기화된 방법 을 실행하려는 경우 주어진 개체에서 먼저 해당 개체의 잠금을 가져와야 합니다. 스레드가 잠금을 얻으면 해당 개체에서 동기화된 메서드를 실행할 수 있습니다. 메소드 실행이 완료되면 스레드가 자동으로 잠금을 해제합니다. 내부적으로 잠금 획득 및 해제는 JVM에서 처리합니다. . 객체 수준 잠금 비정적 메서드를 동기화하려는 경우의 메커니즘입니다. 또는 비정적 코드 블록 하나의 스레드만 클래스의 주어진 인스턴스에서 코드 블록을 실행할 수 있도록 합니다. 이는 인스턴스 수준 데이터를 스레드로부터 안전하게 만들기 위해 항상 수행할 수 있습니다.

예시

public class ObjectLevelLockTest implements Runnable {
   @Override
   public void run() {
      objectLock();
   }
   public void objectLock() {
      System.out.println(Thread.currentThread().getName());
      synchronized(this) {
         System.out.println("Synchronized block " + Thread.currentThread().getName());
         System.out.println("Synchronized block " + Thread.currentThread().getName() + " end");
      }
   }
   public static void main(String[] args) {
      ObjectLevelLockTest test1 = new ObjectLevelLockTest();
      Thread t1 = new Thread(test1);
      Thread t2 = new Thread(test1);
      ObjectLevelLockTest test2 = new ObjectLevelLockTest();
      Thread t3 = new Thread(test2);
      t1.setName("t1");
      t2.setName("t2");
      t3.setName("t3");
      t1.start();
      t2.start();
      t3.start();
   }
}

출력

t1
t2
t3
Synchronized block t1
Synchronized block t3
Synchronized block t1 end
Synchronized block t3 end
Synchronized block t2
Synchronized block t2 end


수업 수준 잠금

Java의 모든 클래스에는 고유한 잠금 이 있습니다. 이는 클래스 수준 잠금에 지나지 않습니다. . 스레드가 정적으로 동기화된 메서드를 실행하려는 경우 , 스레드에 클래스 수준 잠금이 필요합니다. . 스레드가 클래스 수준 잠금을 얻으면 정적으로 동기화된 메서드를 실행할 수 있습니다. 그 클래스의. 메소드 실행이 완료되면 스레드는 자동으로 잠금을 해제합니다. 수업 수준 잠금 여러 스레드가 동기화된 블록에 들어가는 것을 방지합니다. 런타임에 사용 가능한 모든 인스턴스에서.

예시

public class ClassLevelLockTest implements Runnable {
   @Override
   public void run() {
      classLock();
   }
   public void classLock() {
      System.out.println(Thread.currentThread().getName());
      synchronized(ClassLevelLockTest.class) {
         System.out.println("Synchronized block " + Thread.currentThread().getName());
         System.out.println("Synchronized block " + Thread.currentThread().getName() + " end");
      }
   }
   public static void main(String[] args) {
      ClassLevelLockTest test1 = new ClassLevelLockTest();
      Thread t1 = new Thread(test1);
      Thread t2 = new Thread(test1);
      ClassLevelLockTest test2 = new ClassLevelLockTest();
      Thread t3 = new Thread(test2);
      t1.setName("t1");
      t2.setName("t2");
      t3.setName("t3");
      t1.start();
      t2.start();
      t3.start();
   }
}

출력

t3
t2
t1
Synchronized block t3
Synchronized block t3 end
Synchronized block t2
Synchronized block t2 end
Synchronized block t1
Synchronized block t1 end