簡體   English   中英

Java - 比較和交換和同步塊

[英]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() ,那么

  • 保證每個線程看到不同的返回值,並且
  • 全部完成后的最終值保證會增加 N。

AtomicInteger class 還有很多其他方法。 它們中的大多數都對當多個線程訪問變量時會發生什么做出有用的保證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM