衆所周知,簡單的x++
不是原子操作,實際上是讀增量寫操作。這就是爲什麼它應該同步。但是get()
呢?我讀過它應該同步,但有人可以解釋我爲什麼?通過引入happens-before
關係來避免內存一致性錯誤? get()
經常被多個線程調用,而且值很少改變。是不是synchronized get()
放緩他們?在這種情況下是否還有其他方法可以實現同步(不使用AtomicInteger)? volatile
關鍵字在這裏工作?Java同步計數器 - get()怎麼辦?
public class Counter {
private int value;
public synchronized int get() { return value; }
public synchronized int increment() { return ++value; }
public synchronized int decrement() { return --value; }
}
謝謝!
編輯:
我想講清楚。通過使用volatile
我的意思是介紹該關鍵字和刪除在get()
方法。我想知道,如果許多線程正在讀取值,而且很少更改它,它是否會使線程安全,但也更有效。
我只是試圖達到與AtomicInteger不使用它相同的行爲:P 通過使用'volatile'我的意思是引入該關鍵字並在'get()'方法中刪除'synchronized'。我想知道是否它會使線程安全,但如果許多線程讀取值並且很少更改值,它會更有效。 –
是的@JakubKrawczyk,這將工作。你想比AtomicInteger更快嗎?爲什麼不使用這個類?如果這是爲了提高效率,那麼你正在做過早優化的定義。 – Gray
我不是想實現我自己的'AtomicInteger' :)我只是想了解這個問題的同步。我認爲明顯的答案是「使用AtomicInteger」,我想避免它:P它沒有工作;)謝謝! –