繁体   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