[英]Java - Compare and Swap and synchronized Block
public class SimulatedCAS {
private int value;
public synchronized int get() { return value; }
public synchronized int compareAndSwap(int expectedValue, int newValue)
{
int oldValue = value;
if (oldValue == expectedValue)
value = newValue;
return oldValue;
}
}
public class CasCounter
{
private SimulatedCAS value;
public int getValue()
{
return value.get();
}
public int increment()
{
int value.get();
while (v != value.compareAndSwap(v, v + 1))
{
v = value.get();
}
}
}
我參考了一本書“Java並發實踐”
一個計數器必須由多個線程增加。 我嘗試使用比較和交換方法,但最后它使用了同步關鍵字,這可能再次導致線程阻塞和等待。 使用同步塊為我提供了與任何人 state 相同的性能。 使用比較和交換和同步塊有什么區別? 或任何其他方式來實現比較和交換而不使用同步塊。
Real Compare and Swap 進行樂觀鎖定。 它會更改值,然后如果某些東西同時更改了變量,則進行回滾。 因此,如果變量很少被修改,那么 CAS 的性能比同步的要好。
但是如果變量經常被修改,那么同步的表現會更好,因為它不允許任何東西在變量被改變時弄亂。 所以沒有必要進行昂貴的回滾。
我需要用多個線程增加計數器
AtomicInteger
class非常適合。
您可以使用final AtomicInteger i=new AtomicInteger(initial_value);
創建它然后你可以調用i.set(new_value)
來設置它的值,你可以調用i.get()
來獲取它的值,最重要的是你的應用程序,你可以調用i.incrementAndGet()
來原子地增加值。
如果 N 個不同的線程都“同時”調用i.incrementAndGet()
,那么
AtomicInteger
class 還有很多其他方法。 它們中的大多數都對當多個線程訪問變量時會發生什么做出有用的保證。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.