我閱讀的AtomicInteger和這些特性如何的操作都是原子,以及如何使之成爲多線程有用。的AtomicInteger增量不表現爲預期
我寫了下面的程序來測試一樣。
我期待設定的最終大小應該是1000,因爲每個線程循環500次,每次一個線程調用GETNEXT時間假設()它應該得到一個唯一的編號。
但產量總是低於1000我失去了什麼嗎?
public class Sequencer {
private final AtomicInteger i = new AtomicInteger(0);
public int getNext(){
return i.incrementAndGet();
}
public static void main(String[] args) {
final Sequencer seq = new Sequencer();
final Set<Integer> set = new HashSet<Integer>();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i=0; i<500; i++)
set.add(seq.getNext());
}
},"T1");
t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i=0; i<500; i++)
set.add(seq.getNext());
}
},"T2");
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(set.size());
}
}
我想這一點 - '最後一組集= Collections.synchronizedSortedSet(新TreeSet的());'和它的工作。多謝你們。 –
請參閱我的編輯爲什麼不使用同步。 – TwoThe
我明白了你的意思。的使用上面設置的想法是試驗A)如果'AtomicInteger''incrementAndGet()'是原子,b)若操作是原子的,集將還給我大小()1000 if它們是唯一的。但我沒有意識到Hashset操作不是線程安全的並會導致此問題。當我切換到synchronizedSortedSet,我測試了兩者的AtomicInteger和原始int和發現與的AtomicInteger計數總是1000,並與原始的詮釋是不相符的。但我同意你的觀點,即如果你通過不必要的同步來進行線程安全操作,它就會勝過這個目的。 –