Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- SystemCall
- none이미지
- ReflectUtils
- 쓰레드 라이브러리
- 도커
- 문자열 리터럴
- strict stubbing
- AOP
- @Header
- rainbow table
- 프로세스
- java.util.function
- Thread Multiplexing
- sql-mappler
- OS
- task_struct
- django-crontab
- 롬복주의점
- hiberbate
- 함수형 인터페이스
- spring-data-jpa
- FunctionalInterface
- Spring
- functional interface
- Thread Library
- custom annotation
- 운영체제
- Process
- python-socketio
- 문자열 불변성
Archives
- Today
- Total
JH's Develog
[JAVA] Object level lock vs Class level lock 본문
synchronized 블럭을 이용해서 쓰레드를 동기화 할때 괄호안에 아래와 같이 객체의 참조변수(this)가 들어가는 경우가 있고 Class 클래스(.class)가 들어가는 경우가 있습니다.
객체의 참조변수가 들어가는 경우를 Object level lock이라고 하고 Class 클래스가 들어가는 경우를 Class level lock이라고 합니다.
// Object Level locking
public class ObjectLevelLockExample {
public void objectLevelLockMethod() {
synchronized (this) {
//...
}
}
}
// Class Level locking
public class ClassLevelLockExample {
public void classLevelLockMethod() {
synchronized (ClassLevelLockExample.class) {
//...
}
}
}
두 가지 lock의 차이점
- Object level lock
- non-static 메서드나 코드의 non-static 블럭을 동기화 할 때 사용합니다.
- 즉, non-static 데이터를 thread safe하게 만들 때 사용합니다.
- 클래스의 모든 인스턴스가 각자의 lock을 가집니다.
- Class level lock
- 런타임에 사용 가능한 모든 인스턴스에서 여러 스레드가 동기화된 블록에 들어가는 것을 방지하려는 경우 사용할 수 있습니다.
- 즉, static 데이터를 thread safe하게 만들기 위해서 사용해야합니다.
- 클래스의 인스턴스가 여러개 있어도, 클래스 하나당 하나의 lock만 존재합니다.
Class level lock 사용예시
싱글턴 패턴을 Thread Safe하게 구현하는 방법 중에, Double-Check Locking 방식으로 구현할 때 사용할 수 있습니다.
public class DoubleCheckSingleton {
private static volatile DoubleCheckSingleton instance;
public static DoubleCheckSingleton getInstance() {
if( instance == null ) {
synchronized (DoubleCheckSingleton.class) {
if (instance == null) {
instance = new DoubleCheckSingleton();
}
}
}
return instance;
}
...
}
위 코드의 DoubleCheckSingleton 클래스는 클래스당 오직 하나의 인스턴스만 생성할 수 있도록 하기 위해
instance라는 static 변수와 getInstance()라는 static 메서드를 가지고 있으므로 Class level lock을 적용해야 합니다.
[참고]
'JAVA' 카테고리의 다른 글
[JAVA] 자바 쓰레드 동기화(2) - ReentrantLock과 Condition (0) | 2022.07.06 |
---|---|
[JAVA] 자바 쓰레드 동기화(1) - synchronized, wait()/notify() (0) | 2022.07.05 |
[JAVA] 문자열 리터럴이 불변인 이유 (Why String is immutable?) (0) | 2022.01.14 |
[JAVA] 함수형 인터페이스 (Functional Interface) (0) | 2022.01.03 |
[JAVA] 람다식 Lambda Expression (0) | 2022.01.02 |
Comments