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

Javaではvolatileキーワードを使ってvolatileを配列に変えられるか?

volatile修飾子は、JVMに、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の挙動はありません。

この問題を解決するために、JavaはAtomicIntegerArrayとAtomicLongArrayという2つのクラスを提供しています。これらのクラスは、各変数に原子包装された配列を表し、その配列の要素は自動的に更新されます。

つまり、これらのクラスを表す配列の各要素を可変変数としてアクセスすることができます。これらのクラスは提供します。get()およびset()変数を使用してそれぞれの要素を検索したり、各要素に値を割り当てるために使用されます。

原子包装器は整数型と長整数型にのみ使用可能であり、他のデータ型には使用不可で、配列の参照値を再割り当てする必要があるため、配列に要素を分配するたびに再割り当てを行う必要があります。

volatile int[] myArray = new int[3];
myArray [0] = 100;
myArray = myArray;
myArray [1] = 50;
myArray = myArray;
myArray [2] = 150;
myArray = myArray;
基本チュートリアル