在并行环境中,同步(锁)操作是实现真正并行的最大敌人,而且大量的锁竞争严重消耗了系统资源,但在开发当中不能避免多条线程对共享变量的修改,JDK1.5后为我们提供了一组实现了无锁算法(CAS算法)的类,他们分别包装了Integer,Long,Boolean和Integer,Long ...
在并行环境中,同步(锁)操作是实现真正并行的最大敌人,而且大量的锁竞争严重消耗了系统资源,但在开发当中不能避免多条get='_blank'>线程对共享变量的修改,JDK1.5后为我们提供了一组实现了无锁算法(CAS算法)的类,他们分别包装了Integer,Long,Boolean和Integer,Long对应的数组类型
Java代码
- /**
- * Atomically sets to the given value and returns the old value.
- *
- * @param newValue
- * the new value
- * @return the previous value
- */
- public final int getAndSet(int newValue) {
- for (;;) { // 死循环不停尝试,直到成功
- int current = get(); // 获取当前值
- // 若当前值未受其他线程影响,设置为新值,否则进入第二次循环
- if (compareAndSet(current, newValue))
- return current;
- }
- }
在CAS算法当中,首先程序体处于一个无限循环当中,在获取当前值后,使用compareAndSet进行比较,若然其他线程对当值进行修改,compareAndSet將返回false从而进入第二次循环,直到成功.在硬件层面,绝大部分的现代处理器已经支持了原子化的CAS指令,在JDK5.0后JVM已可以使用这个指令来实现并发操作和并发数据结构 Java代码
- public class TestMain {
- @Test
- public void testAtomicReference() throws Exception {
- /*
- * 注意:
- * 要使用AtomicReference引用的类最好重写equals方法
- * compareAndSet将会使用 == 来判断对象是否相等
- */
-
- RayTest test1 = new RayTest();
- RayTest test2 = new RayTest();
-
- // 初始化 AtomicReference,默认值为test1
- AtomicReference<RayTest> reference = new AtomicReference<RayTest>(test1);
-
- // 將test1替换为test2
- reference.compareAndSet(test1, test2);
-
- Assert.assertNotSame(test1, reference.get());
- Assert.assertEquals(test2, reference.get());
- }
- }
在CAS算法当中,整个过程无需加锁,无需等待,无锁的操作实际上可以将多条线程的并发冲突处理由应用层面自行决定,从而提升系统的性能,但使用CAS算法的编码复杂度明显地增加,还好JDK已为我们提供了Atomic类让我们直接使用,推荐遇到类似需求直接使用已提供好的工具
海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com
原标题:并发编程 — 并发数据类型
关键词:数据类型
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。