멀티스레딩 환경에서 둘 이상의 스레드가 공유 리소스에 동시에 액세스할 수 있으므로 시스템의 일관성 없는 동작이 발생할 수 있습니다. 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 } } }