가자미의 개발이야기

[자바] 쓰레드의 동시접근 문제와 동기화 본문

Java/자바 기본 문법

[자바] 쓰레드의 동시접근 문제와 동기화

가자미 2021. 3. 2. 14:15

쓰레드의 동시접근 문제.

여러 쓰레드의 작업이 순차적으로 진행되는 것이 아니고 무작위로 코어가 다른 쓰레드로 이동하는데,

이런 과정에서 작업결과가 우리가 예상한 것과 다르게 나오곤 한다.

 

이런 동시 접근 문제는 여러 쓰레드가 같은 메모리에 접근하거나, 같은 코드를 사용할 때 일어난다.

 

동시접근 문제는 쓰레드 동기화로 해결한다.

 

동기화(synchronized) 메소드

//synchronized에 주목!
//둘 이상의 쓰레드가 접근하는 것을 막겠다는 의미
//한 클래스 내에 여러개의 synchronized 메소드가 존재하면
//하나로 취급. 즉 increment()를 한 쓰레드가 사용중이면, 다른 쓰레드가 decrement를 사용 못함.
//메소드 코드량이 많아지면 성능저하를 일으킴.
//메소드 코드량이 적거나, 메소드 통째로 동기화해야되는 경우에만 사용!
class Counter{
	int count = 0;
	synchronized public void increment() {
		count ++;
	}
	synchronized public void decrement() {
		count --;
	}
	public int getCount() {return count;}
}

동기화(synchronized) 블록

//메소드 통째가 아닌 필요한 문장만 동기화
//한 클래스 안에 존재하는 synchronized 선언은 하나로 취급(동기화 메소드 참고)
class Counter{
	int count = 0;
	public void increment() {
		synchronized(this){
			count ++;
		}
	}
	public void decrement() {
		synchronized(this) {
			count --;
		}
	}
	public int getCount() {return count;}
}