Java 동기화 기법을 만나보기에 앞서, 동기화라는 개념의 등장 배경과 필요한 이유에 대해 먼저 간단히 알아보려 한다.
동기화는 multi thread 혹은 multi process 환경에서 스레드 혹은 프로세스 간 공유 및 수정이 가능한 자원을 다룰 때, 자원의 안정성 및 신뢰성 보장을 위해 각 스레드 혹은 프로세스가 접근 가능한 공동 자원의 sync (싱크)를 맞춰주는 작업 이다.
이러한 동기화의 대표적인 매커니즘은 상호배제를 통해 이루어지고, 시스템에서 상호배제를 구현한 기법은 크게 Mutex와 Semaphore가 있다.
Java에서는 위 세마포어의 한계를 극복하여 구현한 Monitor를 제공하게 되고 (프로그래밍 언어 수준에서 제공), Java의 모든 인스턴스는 Object내부에 구현된 Monitor를 가지고 있다. 그래서 모든 인스턴스는 Monitor를 통해 스레드 동기화를 수행할 수 있게 된다.
동기화가 필요한 메서드나 멤버변수에 synchronized
키워드를 붙여주게 되면 Monitor를 활용하여 Java 내부적으로 상호배제가 이루어지게 된다!
Java에서는 동기화 기법으로 상호배제(보완된 세마포어)를 구현한 Monitor를 Object 내부에 구현하여 모든 인스턴스에 Thread 동기화가 가능하게 하고, 이 Monitor를 활용하여 메서드나 멤버변수를 구현할 수 있는 키워드가 바로 synchronized
이다.
탭이 5개까지만 열리는 브라우저 (CLI)
Reference의 블로그의 코드를 보고 작성하였다.
https://github.com/YunHye-Choi/Java_SkillUp/tree/main/src/com/synchronizedproject
https://tecoble.techcourse.co.kr/post/2021-10-23-java-synchronize/