星空网 > 软件开发 > ASP.net

并发编程 — 并发数据类型

在并行环境中,同步(锁)操作是实现真正并行的最大敌人,而且大量的锁竞争严重消耗了系统资源,但在开发当中不能避免多条线程对共享变量的修改,JDK1.5后为我们提供了一组实现了无锁算法(CAS算法)的类,他们分别包装了Integer,Long,Boolean和Integer,Long对应的数组类型 


AtomicInteger(Long)核心方法: 


public final int get()获取当前值   
public final void set(int newValue)设置当前值   
public final int getAndSet(int newValue)设置新值并返回旧值   
public final boolean compareAmdSet(int expect,int u)若当前值为expect,设置为u   
public final int getAndIncrement()当前值加1,返回旧值   
public final int getAndDecrement()当前值减一,返回旧值   
public final int getAndAdd(int delta)当前值增加delta,返回旧值   
public final int incrementAndGet()当前值加1,返回新值   
public final int decrementAndGet()当前值减1,返回新值   
public final int addAndGet(int delta)当前值增加delta,返回新值   




其他类或方法请参考JDK帮助文档 

AtomicReference
AtomicReferenceArray
AtomicBoolean
AtomicInteger
AtomicIntegerArray
AtomicLong
AtomicLongArray




      我们来看一下CAS算法在AtomicInteger中是如何体现出现到 

Java代码  并发编程 — 并发数据类型

  1. /** 
  2.      * Atomically sets to the given value and returns the old value. 
  3.      *  
  4.      * @param newValue 
  5.      *            the new value 
  6.      * @return the previous value 
  7.      */  
  8.     public final int getAndSet(int newValue) {  
  9.         for (;;) {                   // 死循环不停尝试,直到成功  
  10.             int current = get();     // 获取当前值  
  11.             // 若当前值未受其他线程影响,设置为新值,否则进入第二次循环  
  12.             if (compareAndSet(current, newValue))  
  13.                 return current;  
  14.         }  
  15.     }  



      在CAS算法当中,首先程序体处于一个无限循环当中,在获取当前值后,使用compareAndSet进行比较,若然其他线程对当值进行修改,compareAndSet將返回false从而进入第二次循环,直到成功.在硬件层面,绝大部分的现代处理器已经支持了原子化的CAS指令,在JDK5.0后JVM已可以使用这个指令来实现并发操作和并发数据结构 


      除了Integet和Long等自增类型的原子性操作类外,JDK还提供了更令人心动的类型AtomicReference<V>,他能引用所有的引用类型 

Java代码  并发编程 — 并发数据类型

  1. public class TestMain {  
  2.     @Test  
  3.     public void testAtomicReference() throws Exception {  
  4.         /* 
  5.          * 注意:  
  6.          *      要使用AtomicReference引用的类最好重写equals方法 
  7.          *      compareAndSet将会使用 == 来判断对象是否相等 
  8.          */  
  9.   
  10.         RayTest test1 = new RayTest();  
  11.         RayTest test2 = new RayTest();  
  12.   
  13.         // 初始化 AtomicReference,默认值为test1  
  14.         AtomicReference<RayTest> reference = new AtomicReference<RayTest>(test1);  
  15.   
  16.         // 將test1替换为test2  
  17.         reference.compareAndSet(test1, test2);  
  18.   
  19.         Assert.assertNotSame(test1, reference.get());  
  20.         Assert.assertEquals(test2, reference.get());  
  21.     }  
  22. }  



在CAS算法当中,整个过程无需加锁,无需等待,无锁的操作实际上可以将多条线程的并发冲突处理由应用层面自行决定,从而提升系统的性能,但使用CAS算法的编码复杂度明显地增加,还好JDK已为我们提供了Atomic类让我们直接使用,推荐遇到类似需求直接使用已提供好的工具 




原标题:并发编程 — 并发数据类型

关键词:数据类型

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

商标备案一种保护商标权利的重要手段:https://www.kjdsnews.com/a/1389034.html
商标境外注册申请流程及注意事项:https://www.kjdsnews.com/a/1389035.html
商标国际申请表1详解及申请流程:https://www.kjdsnews.com/a/1389036.html
商标国际申请的最佳途径及流程:https://www.kjdsnews.com/a/1389037.html
商标国际申请的时间安排指南:https://www.kjdsnews.com/a/1389038.html
商标国际申请的多种途径及其优劣比较:https://www.kjdsnews.com/a/1389039.html
300万箱!ONE将投入250亿美元,用于扩大运力:https://www.kjdsnews.com/a/1836472.html
航运系统阻断,美港口无限期关闭!:https://www.kjdsnews.com/a/1836473.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流