2

AtomicBoolean は同期にネイティブ コードを使用します。Javaロックにどのように変換されますか?

違いは何ですか:

AtomicBoolean a = new AtomicBoolean();
synchronized (a) {
   a.set(true);
}

対:

a.set(true)

a 自体が操作がアトミックであることを保証するため、synchronized(a) は必要ありません。しかし、synchronized (a) のロックは a.set(true) と同じロックですか?

4

4 に答える 4

1

いいえAtomicBoolean、実際には、すべてのアトミック クラスは、コンペア アンド スワップを使用してアトミック性を保証しています。

于 2013-07-02T05:41:47.673 に答える
0

これ:

a.set(true);

内部でまったく同期されていません。JDK 1.7 の AtomicBoolean.java のコードを見てください (src.zip から):

/**
 * Unconditionally sets to the given value.
 *
 * @param newValue the new value
 */
public final void set(boolean newValue) {
    value = newValue ? 1 : 0;
}

はい、同期バージョンとは異なります

于 2013-07-02T05:38:04.237 に答える
0

Synchronization キーワードは、JMM に従って 3 つの保証を提供します。1.原子性 2.可視性 3.並べ替え

しかし、同期は本質的にブロックしています。

AtomicInteger、AtomicLong、AtomicBoolean などの Java のすべてのアトミック クラスも、上記の 3 つの保証を提供します。ただし、他のスレッドをブロックしません。

1. 原子性 - compareAndSwap 操作を使用して提供します。2. 可視性と並べ替え - これらは、基になる変数を揮発性として宣言することによって提供されます。

たとえば、AtomicInteger では、基になる int 変数が volatile として宣言されています。

private volatile int value;
于 2013-07-04T19:47:25.713 に答える