스레드의 동기화란.
한 스레드가 특정작업을 끝마치기 전까지 다른 스레드에 의해 방해받지 않도록 하는것.
자바에서는 synchronized블럭을 이용해서 스레드의 동기화를 지원했지만
jsk1.5부터 java.util.concurrent,locks와 java.util.concurrent,atomic패키지를 통해 다양한 방식의 동기화가 가능하다.
예시에서 `Counter` 클래스의
`increment` 메서드와 `decrement` 메서드는
`synchronized` 키워드를 사용하여 동기화된다.
이를 통해
여러 스레드가 동시에 `increment` 또는 `decrement` 메서드를 호출할 때,
스레드 간 경쟁이 발생하지 않고 안전하게 카운터 값을 조작할 수 있다.
class Counter {
private int count = 0;
// synchronized 키워드를 사용하여 메서드를 동기화합니다.
public synchronized void increment() {
count++;
}
// synchronized 블록을 사용하여 특정 부분을 동기화합니다.
public void decrement() {
synchronized (this) {
count--;
}
}
public int getCount() {
return count;
}
}
public class SynchronizedExample {
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
// 여러 스레드에서 increment 메서드를 호출하면서 카운터를 증가시킵니다.
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.decrement();
}
});
thread1.start();
thread2.start();
thread1.join();
thread2.join();
// 모든 스레드가 종료된 후에 최종 카운터 값을 출력합니다.
System.out.println("Counter value: " + counter.getCount());
//Counter value: 12
//스레드 스케줄링에 따라 increment()와 decrement()가 번갈아가며 실행되므로 최종 카운터 값은 예측하기 어렵다.
}
}
'JAVA' 카테고리의 다른 글
스레드의 동기화 lock클래스: ReentrantLock, ReentrantReadWriteLock, StampedLock (0) | 2024.02.26 |
---|---|
synchronized 동기화를 보완하다, wait()과 notify() 락을 가진 상태로 오랜시간 유지하지않도록 (0) | 2024.02.26 |
스레드의 스케줄링/실행제어, 스레드의 상태를 지정하다. (0) | 2024.02.26 |
getState(), 스레드의 상태 확인하기 (0) | 2024.02.26 |
로그 파일을 주기적으로 청소하기, 데몬 스레드의 구현과 실행 (0) | 2024.02.26 |