English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java에서 volatile 키워드를 사용하여 volatile를 배열로 만들 수 있습니까?

volatile 점표기자는 JVM에게, volatile 변수에 접근하는 스레드가 항상 메모리에서 데이터를 가져오도록 지시합니다. 즉, 스레드는 volatile 변수를 캐싱하지 않아야 합니다.

volatile 변수에 대한 접근은 메인 스토리지에缓存的 모든 변수 복제를 동기화합니다. 변경 가능 변수는 객체 타입이나 개인적인 타입의 인스턴스 변수에만 적용됩니다. volatile 객체 참조는 null일 수 있습니다.

예제

public class MyRunnable implements Runnable {
   private volatile boolean active;
   public void run() {
      active = true;
      while (active) { // line 1
         //여기에 일부 코드가 있습니다
      }
   }
   public void stop() {
      active = false; // line 2
   }
}

배열을 volatile하게 만들기

우리가 배열을 volatile로 선언했지만, 배열의 요소는 volatile 행위를 가지지 않습니다.

이 문제를 해결하기 위해 Java는 AtomicIntegerArray와 AtomicLongArray 두 개의 클래스를 제공합니다. 이들은 각각의 변수에 대한 원자 패킹을 가진 배열을 나타내며, 이 배열의 요소는 자동으로 업데이트됩니다.

따라서 이러한 클래스를 표현하는 배열의 각 요소를 volatile 변수로 접근할 수 있습니다. 이러한 클래스는 이를 제공합니다.get()set()변수를 사용하여 각각의 요소를 검색하거나 값을 할당할 수 있습니다.

atomic 패키지는 정수형과 long형에 대해 사용할 수 있으며, 나머지 데이터 타입은 사용할 수 있으므로 배열 요소에 대해 각각 할당할 때마다 배열의 참조 값을 다시 할당해야 합니다.

volatile int[] myArray = new int[3];
myArray [0] = 100;
myArray = myArray;
myArray [1] = 50;
myArray = myArray;
myArray [2] = 150;
myArray = myArray;