✔ Lock 의 범위 - 개념


동기화를 위해 Lock을 한단 개념은 다들 알고 있을 것이다.

이때, Lock의 범위를 지정해 줄 수도 있는데, class / instance 로 나누어 볼 수 있다.

Object level lock Class level lock
static non - staic 데이터를 thread safe하게 만들 때 사용 static 데이터를 thread safe하게 만들기 위해서 사용
범위 클래스의 모든 인스턴스가 각자의 lock을 가질 수 있다. 클래스 하나당 하나의 lock만 존재한다.
public class ObjectLevelLockExample {
   public void objectLevelLockMethod() {
      synchronized (this) {
      }
   }
}

public class ClassLevelLockExample {
   public void classLevelLockMethod() {
      synchronized (ClassLevelLockExample.class) {
      }
   }
}

✔ Lock 의 범위 - 코드


1️⃣ Object level lock

🔽 예제 1) 인스턴스 한개 / 두개 생성에 따른 차이

public class A {
    public synchronized void run(String name) {
        System.out.println(name + "락 걸기");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name + "락 해제");
    }
}
public class hello {

    public static void main(String[] args) {
        A a = new A(); // 인스턴스는 하나.

        Thread thread1 = new Thread( () -> {
            a.run("thread-1");
        });
        Thread thread2 = new Thread( () -> {
            a.run("thread-2");
        });

        thread1.start(); // 쓰레드 2개
        thread2.start();
    }
}

✅ 결과 - 쓰레드 별로 lock을 획득/반납

https://raw.githubusercontent.com/sj9802/images/main/img/image-20230411175301025.png