본문 바로가기
프로그래밍/Java

자바 synchronized

by so5663 2024. 3. 29.

synchronized?

자바에서 멀티쓰레드를 사용할 경우 무조건 한번쯤은 보게된다.

공유될 가능성이 존재하는 자원에 대해 동기화를 제어할 수 있게 해주는 키워드 입니다.

스레드가 해당 자원에 접근중이고 다른 스레드가 같은 자원에 접근 하려고 하는 경우 접근을 대기시키는 기능을 지원함

 

코드 예시

메서드에 synchrozied 사용한 경우 

해당 메서드는 동시에 오직 하나의 스레드만 실행할 수 있습니다.

public synchrozied void incrementCount() {
    this.count++;
}

 

 

코드 블록에 synchrozied 사용한 경우

다음과 같이 this(인스턴스 자신을 참조하는) 객체나 특정 객체에 대한 블록에 synchronized 키워드를 붙이면,

해당 객체에 대한 모든 스레드의 접근이 동기화된다.

public void incrementCount() {
    synchronized(this) {
        count++;
    }
}

 

synchronized 동작

Lock Acquisition: 스레드가 synchronized 키워드가 지정된 메서드나 블록에 진입하려고 할 때, 해당 객체의 모니터 락(monitor lock)을 얻으려고 시도합니다. 만약 다른 스레드가 이미 그 락을 보유하고 있다면, 해당 스레드는 락이 해제될 때까지 대기합니다.

Exclusive Execution: 한 스레드가 해당 메서드 또는 블록 내에서 실행되는 동안, 다른 스레드들은 해당 메서드나 블록에 대한 접근을 차단하고 대기합니다. 

이것은 공유 자원에 대한 동시 접근을 방지하고, 잠재적인 경쟁 조건(race conditions)이나 일관성 문제를 방지합니다.

이러한 동작은 공유 자원에 대한 안전한 동시 접근을 보장하며, 프로그램의 일관성과 안정성을 유지하는 데 중요합니다. 

그러나 synchronized 키워드를 남용하면 성능에 부정적인 영향을 미칠 수 있으므로, 적절한 사용을 고려해야 합니다.