백엔드
자바 synchronized 개념정리
ParkIsComing
2022. 7. 24. 08:56
개념
- 멀티쓰레드 환경에서 여러 쓰레드가 동일한 자원을 참조할 수 있을 때, 해당 공유자원에 대한 동시접근을 막아주는 것이
synchronized
이다. - 여러 쓰레드가 경쟁가능한 자원을 사용하는 영역을 critical section이라고 하는데, 하나의 쓰레드가 이 critical section에 접근할 때
synchronized
를 사용하면 lock을 걸어 다른 다른 쓰레드의 접근을 막을 수 있다. - critical section을 사용중인 쓰레드를 제외한 다른 쓰레드들은 lock이 풀릴 때까지 기다리게 하는 방식으로 동시접근의 순차화가 가능하다.
사용
synchronized
는 다음과 같이 사용되어 다양하게 lock의 범위를 설정한다.
1. 메서드에 synchronized
키워드를 추가
- 그 메서드가 포함된 객체(this)가 lock의 대상이 된다.
단점: 객체에 lock이 걸리기 때문에 lock이 필요없는 멤버 변수에 대해서도 자유로운 접근이 불가능하다.
synchronized void print(String text){
//생략
for(int i-0; i<text.length;i++){
System.out.print(text.charAt(i));
}
}
2. 블록에 `synchronized` 키워드를 추가
- 괄호 안에 인자로 넣는 객체가 lock의 대상이 된다.
void execute(String text){
//생략
synchronized(this){
//생략
for(int i-0; i<text.length;i++){
System.out.print(text.charAt(i));
}
}
}
결론
critical section은 여러 쓰레드가 동시에 접근할 수 없기 때문에 멀티쓰레드 프로그램의 성능에 영향을 끼친다. 따라서 synchronized를 사용한 critical section은 최대한 좁은 범위로 제한하여 사용하는 것이 효율적이다.