synchronized

synchronized 키워드는 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장함

동기화의 용도

  1. 한 스레드가 변경하는 중이라 상태가 일관되지 않은 순간의 객체를 다른 스레드가 접근하지 못하도록 하는 용도 (락을 걸어 동시에 여러 스레드가 접근하는 것을 차단)
  2. 동기화된 메서드나 블록에 들어간 스레드가 같은 락의 보호하에 수행된 모든 이전 수정의 최종 결과를 보게 해줌

스레드가 필드를 읽을 때 항상 수정이 완전히 반영된 값을 얻는 것을 보장하지만, 한 스레드가 저장한 값이 다른 스레드에게 보이는가는 보장하지 않음

ex) 스레드 1이 x = 100을 설정하고, 스레드 2가 그 값을 읽으면, 스레드 2는 100을 읽게 됨. 하지만 그 값이 실제 메모리에서 100으로 반영된 후에 읽을 수 있다는 보장이 없다

동기화는 스레드 사이의 안정적인 통신에 꼭 필요함

동기화 방법

잘못된 코드

//잘못된 코드임!!
public class StopThread {
    private static boolean stopRequested;

    public static void main(String[] args) throws InterruptedException {
        Thread backgroundThread = new Thread(() -> {
            int i = 0;
            while (!stopRequested())
                i++;
        });
        backgroundThread.start();

        TimeUnit.SECONDS.sleep(1);
        requestStop();
    }
}

boolean 필드를 두고 false로 초기화한 후 반복문을 돌게 만듦. 다른 스레드에서 해당 스레드를 멈추게 하고 싶은 경우에 true로 초기화하게 만들어 멈추게 하는 코드

해결 방법