* Object Intrinsic Lock
> 객체 인스턴스를 둘러싸는암시적 잠금으로 작동하는 메서드 레벨 (Method)
synchronized void changeState() { // synchronized(this) 와 같음 (Method 가 속해 있는 Instance 가 Lock으로 사용됨)
sharedResource++;
}
> 객체 인스턴스를 둘러싸는 암시적 잠금으로 작동하는 블록 레벨 (Block)
void changeState() {
synchronized(this) {
sharedResource++;
}
}
> 다른 객체의 암시적 잠금을 가지는 블록 레벨
private final Object mLock = new Object();
void changeState() {
synchronized(mLock ) {
sharedResource++;
}
}
> 클래스 인스턴스를 둘러싸는 암시적 잠금으로 작동하는 메서드 레벨 (Method (Class))
synchronized static void changeState() { // synchronized(MyClass.class) 와 같음 (Method 가 속해 있는 Class 가 Lock으로 사용됨)
staticSharedResource++;
}
> 클래스 인스턴스를 둘러싸는 암시적 잠금으로 작동하는 블록 레벨 (Block (Class))
static void changeState() {
synchronized(MyClass.class) {
staticSharedResource++;
}
}
> 필요 이상으로 Critical Section 을 크게 만드는 것은 나쁜 습관이다
> 정적 메서드에 대한 동기화는 인스턴스 객체가 아닌 클래스 객체의 암시적 잠금으로 동작한다
* Explicit Lock
> ReentrantReadWriteLock
int sharedResource;
private ReentrantLock mLock = new ReentrantLock();
public void changeState() {
mLock.lock();
try {
sharedResource++'
} finally {
mLock.unLock();
}
}
- 2개의 Thread 가 접근할 때
: RR 은 가능 하지만, RW, WW 는 불가
'SW > ::: Java' 카테고리의 다른 글
String (0) | 2020.10.05 |
---|---|
Late Binding (0) | 2020.10.04 |
////200927 JDK 15 // early16 (0) | 2020.09.27 |
@FunctionalInterface (0) | 2020.09.15 |
Thread 의 Garbage Collction (0) | 2019.09.08 |