인스턴스 동기화와 클래스 동기화의 잠금 범위 분석

Java의 synchronized 키워드는 잠금 대상에 따라 동작 방식이 완전히 달라진다. 인스턴스 메서드와 정적 메서드에 각각 적용했을 때 어떤 차이가 있는지 살펴본다. 잠금 대상의 핵심 차이 다음 클래스를 통해 두 가지 동기화 방식을 비교한다: public class Resource { // 인스턴스 잠금 - 각 객체마다 별도의 락 public synchronized void instanceLockA() {} ...

7월 10일 16:26에 게시됨

【黑马点评-3초 특가 쿠폰】3. 비관적 락 synchronized로 한 사람 한 번 구매 보장 및 단일 서버 초과 주문 초기 로직

한 사람 한 번 구매 제약 조건 해결 방법 비관적 락 사용 이유 기존의 낙관적 락 방식은 데이터 변경 여부를 확인해야 하며, 현재는 존재 여부만 판단하는 상황이라 CAS 기법을 활용하기 어렵다. 버전 번호를 사용할 수도 있지만, 추가 필드가 필요하다. 따라서 간단한 구현을 위해 비관적 락을 적용한다. 비관적 락 적용 절차 MyBatis-Plus로 시작/종료 시간 검증 ...

6월 26일 16:47에 게시됨

synchronized 메커니즘과 자바 동기화 최적화 기법

사용자 모드와 커널 모드 JVM에서 스레드 동기화는 초기에는 운영체제의 커널 레벨 리소스를 사용하는 시스템 콜을 필요로 했습니다. 이 방식은 무거운 잠금(heavyweight lock)으로 알려져 있으며, 컨텍스트 스위칭 비용이 크기 때문에 성능에 부담을 줍니다. 현대 JVM은 이러한 문제를 해결하기 위해 다양한 사용자 모드 내 최적화 기법을 도입했습니다. CAS (Compare-an ...

6월 25일 19:39에 게시됨

Java 멀티스레드 제어: 순차, 교차, 동시 실행 패턴 가이드

멀티스레드 환경에서 스레드 실행 순서를 제어하는 것은 동시성 프로그래밍의 핵심 과제입니다. 이 문서에서는 Java에서 제공하는 다양한 동기화 도구를 활용하여 스레드 실행 순서를 제어하는 방법을 세 가지 시나리오로 나누어 설명합니다. 1. 교차 실행 (Alternating Execution) 여러 스레드가 정해진 순서대로 번갈아가며 실행되는 패턴입니다. 1.1 CompletableFutur ...

6월 9일 20:31에 게시됨

Java의 Synchronized와 CAS: 비관적 잠금과 낙관적 잠금 이해하기

Java에서 Synchronized는 비관적 잠금의 대표적인 예로, 어떤 데이터 접근이든 무조건 잠금을 걸어야 한다는 원칙을 따릅니다. 이는 사용자 모드와 커널 모드 간 전환, 잠금 카운터 관리 및 차단된 스레드 검사 등을 포함하는 복잡한 과정을 필요로 합니다. 하지만 하드웨어 명령어 집합의 발전으로 인해 충돌 감지 기반의 낙관적 동시성 제어가 가능해졌습니다. 먼저 작업 ...

6월 6일 02:21에 게시됨

자바 멀티스레드 환경의 데이터 동기화 문제와 해결 방법

멀티스레드 프로그래밍에서 여러 스레드가 동일한 자원에 동시에 접근할 때, 적절한 제어가 이루어지지 않으면 데이터의 일관성이 깨지는 '스레드 안전(Thread Safety)' 문제가 발생합니다. 예를 들어, 여러 스레드가 하나의 공유 변수 값을 증가시키는 단순한 작업조차도 예상치 못한 결과를 초래할 수 있습니다. 데이터 불일치 현상의 발생 공유 자원에 여러 스레드가 ...

6월 5일 18:52에 게시됨