並行処理(Atomic)難易度 標準無料
次のコードの出力として正しいものを選べ。
1 import java.util.concurrent.atomic.AtomicInteger;
2 public class Q5 {
3 public static void main(String[] args) {
4 AtomicInteger a = new AtomicInteger(0);
5 System.out.println(a.getAndIncrement()); // (1)
6 System.out.println(a.incrementAndGet()); // (2)
7 System.out.println(a.getAndAdd(5)); // (3)
8 System.out.println(a.get()); // (4)
9 }
10 }
- A
0 / 2 / 2 / 7(上から順に) - B
1 / 2 / 7 / 7 - C
0 / 1 / 2 / 7 - D
1 / 1 / 7 / 7
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:A✓Gold監修
解説
AtomicInteger の getAndXxx 系は更新前の値を返し、xxxAndGet 系は更新後の値を返す。
- (1)
getAndIncrement():現在0を返し → 値は1。出力 0 - (2)
incrementAndGet():値を2にして → 2を返す。出力 2 - (3)
getAndAdd(5):現在2を返し → 値は7。出力 2 - (4)
get():現在値7。出力 7
- B(1)を「更新後の1」と取り違えた誤り。
getAndIncrementは更新前の0を返す。 - C(2)を「更新前の1」と取り違えた誤り。
incrementAndGetは更新後の2を返す。 - Dget系/AndGet系の返す値(前/後)を全体的に取り違えた誤り。
ひっかけ: メソッド名の語順(get-And-Increment と increment-And-Get)で「返すのが前か後か」が決まる。
実機確認の答え合わせ
出力(単一スレッドなので決定的): 0 2 2 7
✓Gold 保有者による書き下ろし解説・実機で検証済