并发编程系列文章:
初解线程池:http://ray-yui.iteye.com/blog/2072463
详解线程池:http://ray-yui.iteye.com/blog/2075311
并发数据类型:http://ray-yui.iteye.com/blog/2080454
并发数据结构:http://ray-yui.iteye.com/blog/2084202
volatile:http://ray-yui.iteye.com/blog/2231474
判断线程安全:http://ray-yui.iteye.com/blog/2232931
实现线程安全:http://ray-yui.iteye.com/blog/2234688
在并行环境中,同步(锁)操作是实现真正并行的最大敌人,而且大量的锁竞争严重消耗了系统资源,但在开发当中不能避免多条线程对共享变量的修改,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中是如何体现出现到
/**
* 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已可以使用这个指令来实现并发操作和并发数据结构
除了Integet和Long等自增类型的原子性操作类外,JDK还提供了更令人心动的类型AtomicReference<V>,他能引用所有的引用类型
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类让我们直接使用,推荐遇到类似需求直接使用已提供好的工具
分享到:
相关推荐
3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确的对象被破坏 3.5.2 不可变对象与初始化安全性 3.5.3 安全发布的常用模式 3.5.4 事实不可变对象 3.5.5 可变对象 3.5.6 ...
3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确的对象被破坏 3.5.2 不可变对象与初始化安全性 3.5.3 安全发布的常用模式 3.5.4 事实不可变对象 3.5.5 可变对象 3.5.6 ...
本书首先介绍了Go语言的优秀特性、安装设置方法、工程结构、标准命令和工具、语法基础、数据类型以及流程控制方法,接着阐述了与多进程编程和多线程编程有关的知识,然后重点介绍了goroutine、channel以及Go提供的...
Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...
学习Java技术需要掌握多个方面,包括语言基础、面向对象编程、Java标准库、框架与工具、并发编程、以及其他相关的技术。以下是一些Java技术学习的要点: Java语言基础: 数据类型、变量和运算符。 控制流程语句...
├─03 第三章:数据类型.pdf ├─03第三章:数据类型.mp4 ├─04 第四章:字符编码.pdf ├─04第四章:字符编码.mp4 ├─05 第五章:文件处理.pdf ├─05第五章:文件处理.mp4 ├─第一阶段:02作业参考答案.docx ...
基本数据类型,核心点整理 特殊的String类,以及相关扩展API 日期与时间API详解 流程控制语句,和算法应用 函数式编程概念和应用 集合容器 基于分析列表集合源码体系 基于分析地图集合源码体系 IO流机制 IO流核心...
具体内容包括:类和泛型,集合、枚举器和迭代器,数据类型,语言集成查询和lambda表达式,调试和异常处理,反射和动态编程,正则表达式,文件系统I/O,网络和Web,XML,安全,线程、同步和并发,工具箱。本书使用...
所以, 到目前为止,还不清楚 Go 的这些并发机制是否真的比传统语言更容易适用千并发编程, 更不容易出错。 本文在开源社区 GitHub上选取了六个开源的并且用于实际生产环境中的Go应用程序对 Go 语言中并发 Bugs 进行...
Red 是一门新的编程语言,它受到了 REBOL 很大的启发,但由于它有本地代码编译器,Red 的应用领域更加广泛——下到系统编程上到高级脚本,同时提供了对现代的多核 CPU 并发编程的支持。 主要特点为: 函数式、声明...
横梁这个 crate 提供了一组用于并发编程的工具:原子AtomicCell ,一个线程安全的可变内存位置。(no_std) AtomicConsume ,用于从具有“消费”顺序的原始原子类型中读取。(no_std) 数据结构deque ,用于构建任务调度...
并发编程改进: 讨论 Java 8 中对并发编程的改进,包括 CompletableFuture、新的并发工具和并发数据结构等。 其他新特性: 简要介绍 Java 8 中引入的其他新特性,如接口的默认方法、方法引用、Optional 类型等。
并发编程:深入Go的并发模型,包括Goroutines和Channels,掌握并发编程的技巧和错误处理。 接口与类型系统:探索Go的接口、类型断言、结构体和嵌入式类型,学习如何构建灵活的软件设计。 高级特性:学习Go的反射、...
Rust的所有权系统和类型系统使得编写并发程序更加安全和方便,避免了数据竞争和死锁等问题。 Rust支持多种平台,包括Windows、Linux、MacOS等,可以轻松地实现跨平台开发。这使得Rust在操作系统、嵌入式系统、驱动...
掌握基本套接字函数使用方法、TCP协议工作原理、并发服务原理和编程方法。实验内容:在linux平台上实现1个TCP并发服务器,至少可以为10个客户端同时提供服务。 2. 进程间的协调通信(4学时) 掌握进程的概念、进程间...
Red 是一门新的编程语言,它受到了 REBOL 很大的启发,但由于它有本地代码编译器,Red 的应用领域更加广泛——下到系统编程上到高级脚本,同时提供了对现代的多核 CPU 并发编程的支持。 主要特点为: 函数式、声明...
课程首先介绍Go语言的安装和基础语法,包括数据类型、控制结构和错误处理,为学习者打下坚实的基础。随后,课程深入Go的并发模型,通过Goroutines和Channels,学习者将掌握并发编程的核心概念和实践技巧。 在接口与...
lwt, OCaml承诺和并发 ... 它提供了一个数据类型: 承诺,这是一个将在未来确定的价值。 创建一个承诺产生一个计算。 当计算为 I/O 时,我们用你的OCaml代码并行运行它。在默认情况下,在单个线程中运行about代码,因这
横梁 此板条箱提供了一组用于并发编程的工具:原子学 ,一个线程安全的可变内存位置。 (no_std) ,用于按“消费”顺序读取原始原子类型。 (no_std)数据结构 ,用于窃取任务的 ,用于构建任务调度程序。 ,一个有...