동기화(Synchronized)
✒️ 2025-05-15 10:24 내용 수정
하나의 스레드가 임계 영역에 진입하면 락을 걸어서 다른 스레드가 수행하지 못하도록 하고, 작업이 종료되면 락을 풀어서 다른 스레드가 작업하도록 하는 것
- 임계 영역 : 멀티 스레드 프로그램에서 단 하나의 스레드만 처리할 수 있는 영역
- 멀티 스레드 프로그램이 실행될 때 다수의 스레드가 하나의 데이터를 공유하면서 스레드 사이의 자원 소유의 경쟁 때문에 예상치 못한 문제가 발생할 수 있다.
- 메소드에 동기화를 선언하면 그 메소드 전체가 임계 영역으로 설정된다.
- 동기화된 메소드를 호출하면서 자동으로 특정 개체에 Lock을 걸고, 해당 메소드가 리턴할 때 Lock을 풀어줄 수 있다.
- https://www.daleseo.com/synchronization/ 참고
- 스레드가 어떤 객체의 필드에 본인만 접근해야 하는 경우를 생각해보자. (독점적이고 일관적인 접근권이 필요한 경우라고 말한다)
- 이 때 스레드는 필드에 접근하기 전에 해당 객체에 반드시 락을 걸어야 한다.
- 다른 스레드가 락이 걸린 필드에 접근하려고 하면 접근이 차단당한다.
- 필드를 이용한 작업이 끝나면 락을 풀어준다.
public synchronized void 메소드이름()
블록 동기화 처리
전체 메소드가 아닌 특정 영역만 동기화 처리하는 것
- 스레드 동기화를 하면 메소드 전체를 동기화하기 때문에, 메소드 처리 시간이 길어지면 성능에 지장이 생길 수 있다.
- 동기화 블록을 이용하면 메소드 내의 동기화 대상을 세밀하게 설정할 수 있다. (임계영역을 최소화할 수 있다)
- https://codedragon.tistory.com/6388 , https://cornswrold.tistory.com/184 참고
- 동기화할 특정 개체(Lock을 걸 객체)를 지정할 수 있다.
- 자기 자신을 동기화할 객체로 지정할 때 this 로 할 수 있다.
- 위의 스레드 동기화와 synchronized 가 들어간 부분을 비교해보자.
synchronized (Lock을걸객체이름) {}