앞선 포스팅에서 멀티쓰레드의 장점과 문제점을 다루었다 ( http://galid1.tistory.com/11 )
오늘은 원초적이지만 가장 간단한 멀티쓰레드의 문제점 해결방법을 포스팅 할 것이다.
해결방법은 synchronized 를 보호하고자 하는 변수, 메소드 등에 사용하는 것이다
=>
public synchronized void count() {
acquire();
try {
Thread.sleep(1000);
num++;
} catch (InterruptedException e) {
e.printStackTrace();
}
release();
}
1. 이렇게 메소드 앞에 synchronized 키워드를 사용한다면 한 쓰레드가 해당 메소드에 접근할때 lock을 가지고 들어간다
2. 다른 쓰레드가 해당 메소드에 또 접근하려 한다면 lock을 가지고 있지 않기 때문에 접근을 하지 못한다
3. lock을 가지고 있던 스레드가 해당 메소드의 실행을 모두 마치면 lock을 해지하기 때문에 다른 쓰레드가 또 접근이 가능하다
4. 결과적으로 num 변수에 접근하는 count() 메소드는 "Thread Safe" 상태가 된다
** 하지만 Synchronized 는 엄청난 기능저하를 불러오므로
정확히 동기화가 필요한 곳에서만 Synchronized를 사용함으로써 기능저하를 최소할 수 있다.
ex)
public void count() {
synchronized( 공유되는 객체 ){
try {
Thread.sleep(1000);
num++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
'Language > Java' 카테고리의 다른 글
Java - 초기화 순서 (0) | 2018.10.28 |
---|---|
Java - 자바 가상머신(JVM: Java Virtual Machine) (0) | 2018.10.28 |
Java - 멀티쓰레드 (Multi Thread) (0) | 2018.08.26 |
Java - InputStream 의 read()메소드는 왜 int형을 반환 하는가 (0) | 2018.08.25 |
Java - String 과 StringBuffer 클래스 (0) | 2018.08.25 |