http://www.javamex.com/tutorials/synchronization_volatile.shtml을 참조하면 다음과 같은 경우 키워드를 사용해야합니까? 추가 규칙으로 인해 volatile
키워드를 사용해야하는지 잘 모르겠습니다. 3.2 개의 다른 쓰기 및 읽기 스레드가 동시에 활성화되지 않으면 휘발성을 사용해야합니까?
- 프리미티브 정적 변수는 스레드 A로 작성 될 것이다
- 같은 프리미티브 정적 변수는 스레드 B에 의해 판독 될 만 실행
- 스레드 B, 스레드 A는 "죽은 후 ". 그것은 "죽음"후,
는 스레드 A가 작성한 새 값이 항상 메인 메모리에 전념 할 것이다 ("죽은"수단, 스레드 A의 무효 실행의 마지막 문장은 완료)? 그렇다면 위의 3 가지 조건이 충족 될 경우 volatile
키워드가 필요하지 않음을 의미합니까?
이 경우 volatile
이 필요하다고 생각됩니다. 필요한 경우 ArrayList이 손상되었을 수 있습니다. 하나의 스레드가 구성원 변수 인 size
을 삽입하고 업데이트 할 수 있습니다. 나중에 다른 스레드 (동시에 사용하지 않음)는 ArrayList
의 size
을 읽을 수 있습니다. ArrayList
소스 코드를 보면 size
이 (가) volatile로 선언되지 않고 있습니다.
ArrayList
의의 JavaDoc에서 만
복수의 thread가 동시에 ArrayList에 인스턴스에 액세스하기위한
ArrayList
가 사용하기에 안전이 아니라고 언급하지만,하지 않는
여러 스레드가 서로 다른 타이밍에서 ArrayList의 인스턴스에 액세스 할 수 있습니다.
는 여전히 휘발성 (동기화 또는 다른 형태)를 사용할 필요가, 내가이 문제
public static void main(String[] args) throws InterruptedException {
// Create and start the thread
final ArrayList<String> list = new ArrayList<String>();
Thread writeThread = new Thread(new Runnable() {
public void run() {
list.add("hello");
}
});
writeThread.join();
Thread readThread = new Thread(new Runnable() {
public void run() {
// Does it guarantee that list.size will always return 1, as this list
// is manipulated by different thread?
// Take note that, within implementation of ArrayList, member
// variable size is not marked as volatile.
assert(1 == list.size());
}
});
readThread.join();
}
확실한 질문은 왜 누군가가 2 개의 스레드를 사용하게 될까요? 그냥 학문? –