Given the code fragments:
3 4 5 6 7 8 9 10 11 | class MyThread implements Runnable { private static AtomicInteger count = new AtomicInteger(0); public void run() { int x = count.incrementAndGet(); System.out.print(x + " "); } } |
and
20 21 22 23 24 25 26 | Thread thread1 = new Thread(new MyThread()); Thread thread2 = new Thread(new MyThread()); Thread thread3 = new Thread(new MyThread()); Thread[] ta = {thread1, thread2, thread3}; for (int x = 0; x < 3; x++) { ta[x].start(); } |
Which statement is true?
A. The program prints 1 2 3 and the order is unpredictable.
B. The program prints 1 2 3.
C. The program prints 1 1 1.
D. A compilation error occurs.
題解
AtomicInteger的incrementAndGet方法,可以使AtomicInteger所表示的整數值加一後,同時回傳整數結果,在操作AtomicInteger物件的數值時,同一時間永遠只有一個執行緒可以存取,所以可以達成thread-safe。
程式第8行的x區域變數,在每個執行緒中的數值都不一樣,排序後為1、2、3。但是執行緒執行第9行的順序不同,因此輸出結果會是1、2、3的任意排列組合。
留言