스레드로부터 안전한 코드를 작성할 때 고려해야 할 사항:
1. 공유변수
2. 변경 가능한 변수
공유란 여러 스레드가 동시에 액세스할 수 있다는 의미이고, 변경 가능이란 해당 값이 수명 주기 동안 변경될 수 있음을 의미합니다.
예를 들어 다음 count 변수는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
//스레드에 안전하지 않은 클래스
공개 클래스 UnsafeCount {
private int count = 0; //이 변수는 공유됩니다.
public void 증가() { //여기에는 동기화 메커니즘이 없으며 여러 스레드가 동시에 액세스할 수 있습니다.
count++; //이 변수는 변수입니다.
}
공개 int getCount() {
반환 횟수;
}
}
이 문제를 해결하는 방법에는 4가지가 있습니다.
1. 스레드 간에 상태 변수를 공유하는 대신 변수를 메서드로 캡슐화할 수 있습니다(상태 비저장 개체는 스레드로부터 안전해야 함). 메서드의 변수는 각 스레드에만 적용되고 다른 스레드와 공유되지 않기 때문입니다. 예를 들어:
다음과 같이 코드 코드를 복사합니다.
공개 int 추가(정수 개수){
return ++count;//여기서 상태 비저장 객체는 스레드로부터 안전해야 한다고 말할 수도 있습니다.
}
2. 상태 변수를 불변 변수로 수정합니다.
다음과 같이 코드 코드를 복사합니다.
개인 최종 정수 개수 = 0;
3. 상태 변수에 접근할 때 동기화 전략을 사용하세요.
다음과 같이 코드 코드를 복사합니다.
공개 동기화 무효 증가() {
카운트++;
}
4. 원자 변수 클래스를 사용하십시오.
다음과 같이 코드 코드를 복사합니다.
개인 AtomicInteger 수;
공공 무효 증가() {
count.getAndAdd(1);
}