여러 프로세스나 스레드가 동시에 리소스를 접근하려 할 때 발생하는 문제.
데이터베이스, 파일 시스템, 메모리 등 다양한 리소스에서 동시성 이슈가 발생할 수 있으며, 이는 데이터 무결성 문제, 성능 저하, 프로그램 크래시 등을 초래할 수 있음
프로세스 : 실행 중인 프로그램의 인스턴스를 의미
스레드 : 프로세스 내에서 실행되는 흐름의 단위
프로그램 크래시 : 프로그램이 예상치 못한 이유로 강제로 종료되거나 응답하지 않는 상태를 의미
synchronized 키워드 : 특정 코드 블록이 동시에 하나의 스레드만 접근하도록 함public synchronized void synchronizedMethod() {
// 동기화된 코드
}
Lock 객체 : 자바의 java.util.concurrent.locks 패키지에 있는 Lock 인터페이스를 사용하여 동기화를 구현Lock lock = new ReentrantLock();
lock.lock();
try {
// 동기화된 코드
} finally {
lock.unlock();
}
AtomicInteger, AtomicLong 등의 클래스를 사용할 수 있음AtomicInteger counter = new AtomicInteger();
counter.incrementAndGet();
SELECT * FROM table_name WHERE condition FOR UPDATE;
Collections.unmodifiableList 와 같은 불변 컬렉션을 사용자바에서 동기화 사용하기
public class Counter {
private int count = 0;
// 동기화된 메서드
public synchronized void increment() {
count++;
}
public synchronized int getCoint() {
return count;
}
}
increment 와 getCount 메서드가 동기화 되어, 동시에 여러 스레드가 접근할 때도 데이터의 일관성을 유지할 수 있음