진짜 개발자
본문 바로가기

Language/Java

Java - 쓰레드 동기화 (Synchronized)

728x90


앞선 포스팅에서 멀티쓰레드의 장점과 문제점을 다루었다 ( 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();

}

   }

}