Volatile変数を使用するか、原子変数を使用するか
4516 ワード
原子変数がより強い以上、volatile変数を使用する必要がありますか?volatile変数をいつ選択し、原子変数をいつ選択しますか?もちろん、この選択はマルチスレッドが同時発生するシーンでのみ発生しますが、マルチスレッドが同時発生する目的は、スループットの向上と遅延応答の低減にあるので、まずセグメントテストコードと実行結果を見てみましょう.
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
public class TestVolatile {
private static int CALC_TIME = 1000;
private static final int THREAD_NUM = 100;
private AtomicInteger ai;
private int i;
private volatile int vi;
public TestVolatile(){
ai = new AtomicInteger(0);
i = 0;
vi = 0;
}
public static void main(String[] args) throws InterruptedException {
System.out.println("Calculation Times:" + CALC_TIME + " ----------------------");
test();
CALC_TIME = 10000;
System.out.println("Calculation Times:" + CALC_TIME + " ----------------------");
test();
CALC_TIME = 100000;
System.out.println("Calculation Times:" + CALC_TIME + " ----------------------");
test();
CALC_TIME = 1000000;
System.out.println("Calculation Times:" + CALC_TIME + " ----------------------");
test();
}
private static void test() throws InterruptedException {
testAi();
testI();
testVi();
}
private static void testAi() throws InterruptedException {
TestVolatile testVolatile = new TestVolatile();
CountDownLatch begSignal = new CountDownLatch(1);
CountDownLatch endSignal = new CountDownLatch(THREAD_NUM);
for (int i = 0; i
:
Calculation Times:1000 ----------------------
Total time consumed by atomic increment : 8
Total time consumed by synchronized increment : 6
Total time consumed by volatile increment : 5
Calculation Times:10000 ----------------------
Total time consumed by atomic increment : 23
Total time consumed by synchronized increment : 24
Total time consumed by volatile increment : 15
Calculation Times:100000 ----------------------
Total time consumed by atomic increment : 354
Total time consumed by synchronized increment : 360
Total time consumed by volatile increment : 148
Calculation Times:1000000 ----------------------
Total time consumed by atomic increment : 3579
Total time consumed by synchronized increment : 3608
Total time consumed by volatile increment : 1519
△ のプログラムに があるのではないかと っていますが、しばらく が つからないので、レンガを ってください.
から, の はsynchronizedと の が く, が じられず,volatile は の (もちろん++ は がある)を させるため,volatile が を たすならvolatile を に し, に ぐ.では、volatile はいつ できますか? が するベストプラクティスは、 の3つの を に たすことです. の き み は、 の の に する、または、 の が スレッドのみ されることを する. が の と に を しない . へのアクセス に をロックする はありません.
:
を たす はvolatileブール , のデータ は を いる.