Javaレビュー-原子性、可視性、順序

アトミシティ

Atomicity:1つの操作または複数の操作が実行されないか、すべてが実行され、実行プロセスが何らかの要因によって中断されることはありません。

簡単な例は、銀行カードの送金、AからBへの送金です。この場合、Aからお金を差し引いてBにお金を追加するプロセスはアトミックである必要があります。アトミックでない場合は、問題が発生します。

可視性

可視性:複数のスレッドが同じ変数にアクセスする場合、1つのスレッドがこの変数の値を変更する限り、他のスレッドはすぐにそれを見ることができるはずです。

秩序

順序性:つまり、プログラムの実行順序はコードの順序で実行されます。

プログラムの効率を向上させるために、JVMは入力コードを再配置する場合があります。つまり、仮想マシンが実行される順序は、必ずしも作成したコードの順序とは限りません。命令を再配置しますが、プログラム実行の結果がコード実行の結果と同じになるようにします。ただし、命令の再配置では、複数のスレッドが関係する場合にのみ、単一のスレッドが同じ結果を実行することが保証されます。

//线程1:
context = loadContext();   //语句1
inited = true;             //语句2
 
//线程2:
while(!inited ){
    
    
  sleep()
}
doSomethingwithconfig(context);

如果线程1先执行了语句2,这时线程2会跳出循环,但是这时的context可能为null。

上記の3つの特性を確保する方法

アトミシティ

単純な操作の場合、原子性を保証できます。

x = 10;         //语句1,原子性,直接赋值
y = x;         //语句2,无原子性,先取出x的值,再赋给y
x++;           //语句3,无原子性,与上同理
x = x + 1;     //语句4,无原子性,与上同理

より広い範囲の原子性を確保するために、ロック(同期およびロック)を使用できます

可視性

揮発性キーワード。変数を変更する場合、他のスレッドが読み取ることができるように、変数の変更された値をメインメモリにすぐに更新できることが保証されます。

同期とロックも保証できます。原則として、コードブロックと変数に同時にアクセスできるのは1つのスレッドだけです。

秩序

Volatileはある程度の順序を保証でき、syncedとlockは順序を保証でき、ロックするコードは一度に1つのスレッドのみがアクセスでき、他のスレッドはそれにアクセスできません。特定の意味も順序を保証します。

おすすめ

転載: blog.csdn.net/why1092576787/article/details/114702965