1. 스레드의 특징
직접 작성한 CustomPrintStream 클래스의 동작에서 문제가 발생한 이유는
하나의 프로세스 내에서 동작하는 스레드들이 하나의 동일한 메모리를 공유하기 때문
앞서 9. 순차 처리 개선하기 에서 별도의 프로세스를 생성하지 않고도,
하나의 프로세스에서 추가적인 스레드를 생성하는 것만으로 메모리 공간을 절약할 수 있다는 것은
장점이자 단점이 될 수 있음(Trade-off 관계)
1. 스레드의 특징: 스레드 간 프로세스 내 메모리 공유
각각의 스레드는 하나의 동일한 프로세스 내에서 동작하기 때문에 서로 다른 프로세스끼리 통신을 할 필요가 없다는 특징은,
각 스레드들이 하나의 프로세스 내에 존재하는 프로세스 주소 공간을 공유하기 때문에 가능한 것이라고 볼 수 있음
2. 메모리 공유에 따른 문제점: 프로그램을 실행할 때마다 매번 다르게 동작
각각의 스레드들이 하나의 프로세스 내에서 동작하기 때문에 프로세스 간 통신을 위한 문제는 사라졌지만, 그에 따라 다음과 같은 문제가 발생할 수 있음
하나의 프로세스 내에 존재하는 2개 이상의 스레드들이 메모리 내 공유 자원(resource)에 거의 동시에 접근하면서 실행할 때마다 다르게 동작하게 됨
여기서 count 변수는 서로 다른 스레드들이 동시에 접근할 가능성이 있는
메모리 내 공유 자원으로 볼 수 있음
→ count는 공유 변수
Counter.java
// 카운트 값을 관리하는 클래스 Counter.java
class Counter {
private int count = 0;
public void increment() {
count++;
}
public int getCount() {
return count;
}
}2개의 스레드를 통해 각각 1부터 50까지 연산 처리 수행 후 결과값 반환
Main.java
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
Thread t1 = new Thread(() -> {
for (int i = 1; i <= 50; i++) {
counter.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 1; i <= 50; i++) {
counter.increment();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Final count: " + counter.getCount());
}
}실행 결과
결과값이 일관된 100이 아니라 실행할 때마다 실행 결과가 매번 달라질 수 있음
97 // 첫 번째 실행 결과
101 // 두 번째 실행 결과
100 // 세 번째 실행 결과
..Last updated on