STUDY/JAVA

[JAVA] 동기화 sychronized

ReCode.B 2023. 5. 10. 00:49
728x90

 

스레드동기화와 상호배제란?

동기화 :
여러 스레드나 프로세스가 공유 자원에 접근할 때,
동시에 접근하는 것을 막고 순서를 조정하여 데이터 일관성을 유지하는 것을 의미합니다.
멀티 스레드 환경에서 여러 스레드가 동시에 공유 자원에 접근할 때, 스레드 간의 경쟁이 발생합니다. 이 경쟁은 예상치 못한 결과를 초래할 수 있으며, 스레드 간의 실행 순서나 작업을 조율하지 않으면, 데이터 일관성을 유지할 수 없게 됩니다. 따라서 스레드 간의 동기화는 상호 배제, 메시지 전달, 교착 상태 등의 문제를 방지하고, 프로그램의 안정성과 일관성을 유지하는 데 중요한 역할을 합니다.
자바에서는 synchronized 를 사용하여 스레드 간의 동기화를 구현할 수 있습니다. 

상호배제 :
공유 자원을 여러 프로세스나 스레드에서 동시에 접근하는 것을 막는 것을 의미합니다. 즉, 어떤 프로세스나 스레드가 공유 자원을 사용하고 있을 때, 다른 프로세스나 스레드가 동시에 접근해서 변경하거나 읽는 것을 방지하는 것입니다.
상호 배제를 구현하는 대표적인 방법으로는 락(Lock)이 있습니다. 락은 여러 스레드가 동시에 실행될 때, 락이 걸린 코드 블록은 하나의 스레드만 실행하도록 보장하여 상호 배제를 구현합니다. 락은 스레드 동기화에 사용되는 가장 기본적인 메커니즘 중 하나로, Java에서는 synchronized 키워드나 ReentrantLock 클래스를 사용하여 락을 구현할 수 있습니다.
상호 배제는 동시에 접근하면 안 되는 공유 자원에 대한 안전성을 보장하고, 경쟁 상황에서 발생하는 문제를 방지하여 프로그램의 안정성과 일관성을 유지하는 데 중요한 역할을 합니다.
 

 

sychronized

스레드가 사용중인 객체를 다른 스레드가 변경할수없도록 하려면

스레드 작업이 끝날때까지 객체에 잠금을 걸어서 다른 스레드가 사용할수 없도록 해야한다. 

멀티스레드프로그램에서 단하나의 스레드만 실행할수있는 코드영역을 임계영역(critical section)이라고한다.

자바는 임계영역을 지정하기위해 동기화(synchronized)메소드와 동기화블록을 제공한다

 

 

동기화메소드 예시:

public synchronized void method(){
임계영역;
}//단하나의스레드만실행

스레드가 객체 내부의 동기화 메소드 또는 블록에 들어가면

즉시 객체에 잠금을 걸어 다른 스레드가 임계영역코드를 실행하지 못하도록한다.

 

 

동기화블록 예시:

public void method(){
//여러스레드가 실행 가능 영역
...

    synchronized(){
    임계영역;
    }//단하나의스레드만실행

//여러스레드가 실행 가능 영역
...
}

전체 내용이 아닌 일부내용만 임계영역으로 만들고 싶다면 아래와 같은 동기화 블록을 만들면된다

 

 

추가 간단 예시:

public class SynchronizedExample {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

두 메소드는 각각의 객체 인스턴스에 락이 걸리게 되어, 여러 스레드가 동시에 해당 메소드에 접근할 수 없습니다. 이를 통해, increment() 메소드에서 count 값을 증가시키고 getCount() 메소드에서 count 값을 반환할 때, 데이터 일관성을 유지할 수 있습니다.

728x90