멀티스레딩 환경에서 둘 이상의 스레드가 공유 리소스에 동시에 액세스할 수 있으므로 시스템의 일관성 없는 동작이 발생할 수 있습니다. Java는 잠금 개념을 사용하여 공유 리소스 또는 객체의 동시 액세스를 제한합니다. 잠금은 두 가지 수준으로 적용할 수 있습니다. -
- 객체 수준 잠금 - 비정적 메서드 또는 코드의 비정적 블록이 하나의 스레드에서만 액세스되어야 할 때 사용할 수 있습니다.
- 클래스 수준 잠금 - 런타임에 사용 가능한 모든 인스턴스에서 여러 스레드가 동기화된 블록에 들어가는 것을 방지하려는 경우 사용할 수 있습니다. 정적 데이터를 스레드로부터 안전하게 만들기 위해 항상 사용해야 합니다.
| Sr. 아니요. | 키 | 객체 수준 잠금 | 클래스 수준 잠금 |
|---|---|---|---|
| 1 | 기본 | 비정적 메소드를 원하거나 코드의 비정적 블록이 하나의 스레드에서만 액세스되어야 할 때 사용할 수 있습니다. | 여러 스레드가 런타임에 사용 가능한 모든 인스턴스에서 동기화된 블록에 들어가는 것을 방지하려는 경우 사용할 수 있습니다. |
| 2 | 정적/비정적 | 비정적 데이터 스레드를 안전하게 만드는 데 항상 사용해야 합니다. | 정적 데이터를 스레드로부터 안전하게 만들기 위해 항상 사용해야 합니다.
|
| 3 | 잠금 수 | 클래스의 모든 객체에는 자체 잠금 장치가 있을 수 있습니다. | 클래스의 여러 객체가 존재할 수 있지만 항상 한 클래스의 클래스 객체 잠금을 사용할 수 있습니다. |
클래스 레벨 잠금의 예
public class ClassLevelLockExample {
public void classLevelLockMethod() {
synchronized (ClassLevelLockExample.class) {
//DO your stuff here
}
}
} 객체 레벨 잠금의 예
public class ObjectLevelLockExample {
public void objectLevelLockMethod() {
synchronized (this) {
//DO your stuff here
}
}
}