SeouliteLab
[Java/자바] 동기화 블록(Synchronized Block)의 활용과 이해 본문
Java에서는 다중 스레드 환경에서의 동시 접근 문제를 해결하기 위해 동기화 블록인 synchronized block을 제공합니다. 이 블록을 사용하여 특정 코드 영역을 임계 구역으로 설정하여 한 번에 한 스레드만 접근하도록 보장할 수 있습니다. 이번 글에서는 synchronized block을 어떻게 사용하고 이해할 수 있는지 알아보겠습니다.
동기화 블록(Synchronized Block) 설명
동기화 블록의 이해
동기화 블록은 여러 스레드가 공유 자원에 접근할 때 발생하는 경쟁 조건을 해결하기 위해 사용됩니다. synchronized 키워드를 사용하여 특정 객체 또는 클래스에 대한 잠금을 설정하고, 임계 영역으로 설정한 코드 블록을 하나의 스레드만 실행할 수 있도록 합니다.
예제 1: 기본적인 동기화 블록 사용
디렉토리: src/main/java/com/example/synchronization
파일명: SynchronizedBlockExample.java
public class SynchronizedBlockExample {
private int count = 0;
// synchronized block 사용
public void increment() {
synchronized (this) {
count++;
System.out.println("숫자 증가: " + count);
}
}
}
예제 2: 다중 스레드에서의 동기화 블록 활용
디렉토리: src/main/java/com/example/synchronization
파일명: Main.java
public class Main {
public static void main(String[] args) {
SynchronizedBlockExample example = new SynchronizedBlockExample();
// 다중 스레드에서 increment 메소드 호출
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
example.increment();
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
example.increment();
}
});
thread1.start();
thread2.start();
}
}
예제 3: 여러 객체에 대한 동기화
디렉토리: src/main/java/com/example/synchronization
파일명: MultipleObjectsExample.java
public class MultipleObjectsExample {
private int count = 0;
// synchronized block을 사용하여 여러 객체에 대한 동기화
public void increment() {
synchronized (this) {
count++;
System.out.println("숫자 증가: " + count);
}
}
}
예제 4: 스레드 안전성과 동기화
디렉토리: src/main/java/com/example/synchronization
파일명: ThreadSafetyExample.java
public class ThreadSafetyExample {
private int count = 0;
// synchronized block을 사용하여 스레드 안전성 보장
public synchronized void increment() {
count++;
System.out.println("숫자 증가: " + count);
}
}
예제 5: 스레드 안전성과 성능
디렉토리: src/main/java/com/example/synchronization
파일명: PerformanceExample.java
public class PerformanceExample {
private int count = 0;
// synchronized block 대신 synchronized 메소드 사용
public synchronized void increment() {
count++;
System.out.println("숫자 증가: " + count);
}
}
'프로그래밍' 카테고리의 다른 글
Vue.js 반복문 활용하기: 반응형 데이터로 동적인 리스트 만들기 (0) | 2024.03.22 |
---|---|
오픈레스티(OpenResty) 소개: Nginx 기반 웹 서버와 Lua 프로그래밍의 완벽한 결합 (0) | 2024.03.22 |
[Java/자바] 접근 제어자(public, private, protected, default) 이해하기 (0) | 2024.03.21 |
[Java/자바] 'throw'와 'throws'의 차이 알아보기 (0) | 2024.03.21 |
MTProto: Telegram의 암호화 통신 프로토콜 (0) | 2024.03.21 |