본문 바로가기

전체 글

(382)
[JAVA] ReentrantLock 0. 들어가기 전자바에서 멀티스레드 환경에서의 동기화를 위해 가장 기본적으로 제공되는 도구는 synchronized 키워드입니다.자바 1.0부터 제공되어 왔으며, 문법적으로 간단하고 자동으로 락 해제까지 지원해주는 매우 편리한 기능입니다.하지만 synchronized 는 다음과 같은 한계점을 가지고 있었습니다. ❌ synchronized의 한계점1) 무한 대기BLOCKED 상태에 있는 스레드는 락을 획득할 때까지 무한정 기다립니다. 락을 일정 시간까지만 기다리는 타임아웃 기능이 없으며, 인터럽트로 대기 상태를 해제할 수도 없습니다.2) 공정성 부족락이 해제되었을 때 어떤 스레드가 락을 먼저 획득할지는 보장되지 않습니다. 심할 경우, 특정 스레드는 오랫동안 락을 획득하지 못하는 상황이 발생할 수 있습니다...
[JAVA] synchronized 동기화 0. 들어가기 전멀티스레드를 사용할 때 가장 주의해야 할 점은, 같은 자원(리소스)에 여러 스레드가 동시에 접근할 때 발생하는 동시성 문제 (concurrency issue)입니다. 이처럼 여러 스레드가 동시에 접근하는 자원을 공유 자원(shared resource)이라고 하며, 대표적으로는 클래스의 인스턴스 필드(멤버 변수)가 이에 해당합니다. 멀티스레드 환경에서는 이러한 공유 자원에 대한 접근을 적절히 동기화(synchronization) 하지 않으면, 예기치 않은 결과나 데이터 불일치 문제가 발생할 수 있습니다. 동시성 문제가 실제로 어떤 상황에서 발생하는지 이해하기 위해, 간단한 은행 출금 예제를 통해 살펴보겠습니다.이 인터페이스는 은행 계좌에서 출금 기능을 제공하며, 다음 두 가지 메서드를 포함..
[JAVA] happens-before 관계 자바 메모리 모델(Java Memory Model) Java Memory Model(JMM)은 자바 프로그램이 어떻게 메모리에 접근하고 수정할 수 있는지를 규정하며, 특히 멀티 스레드 프로그래밍에서 스레드 간의 상호작용을 정의 한다. JMM에 여러가지 내용이 있지만, 핵심은 여러 스레드들의 작업 순서를 보장하는 happens-before 관계에 대한 정의다. ✏️ happens-beforehappens-before 관계는 자바 메모리 모델에서 스레드 간의 작업 순서를 정의하는 개념이다. 만약 A 작업이 B 작업보다 happens-before 관계에 있다면, A 작업에서의 모든 메모리 변경 사항은 B 작업에서 볼 수 있다. 즉, A 작업에서 변경된 내용은 B 작업이 시작되기 전에 모두 메모리에 반영된다.h..