둘 다 개체 수준 잠금 및 클래스 수준 위치 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