* 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

+ Recent posts