来源: 深入理解Java内存模型(五)——锁
java的CAS同时具有 volatile 读和volatile写的内存语义,
因此Java线程之间的通信现在有了下面四种方式:
线程写volatile变量,随后B线程用CAS更新这个volatile变量。
线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量。
线程用CAS更新一个volatile变量,随后B线程读这个volatile变量。
Java的CAS会使用现代处理器上提供的高效机器级别原子指令,这些原子指令以原子方式对内存执行读-改-写操作,这是在多处理器中实现同步的关键(从本质上来说,能够支持原子性读-改-写指令的计算机器,是顺序计算图灵机的异步等价机器,因此任何现代的多处理器都会去支持某种能对内存执行原子性读-改-写操作的原子指令)。同时,volatile变量的读/写和CAS可以实现线程之间的通信。把这些特性整合在一起,就形成了整个concurrent包得以实现的基石。如果我们仔细分析concurrent包的源代码实现,会发现一个通用化的实现模式:
然后,使用CAS的原子条件更新来实现线程之间的同步;
同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信。
AQS,非阻塞数据结构和原子变量类(java.util.concurrent.atomic包中的类),这些concurrent包中的基础类都是使用这种模式来实现的,而concurrent包中的高层类又是依赖于这些基础类来实现的。从整体来看,concurrent包的实现示意图如下:
由上可知 , CAS 和 volatile 在Java的并发编程中,所起到的巨大作用:
CAS解决了比较和更新的原子性,volatile保证对于所有的线程都是可见的。
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
volatile关键字有两层含义:
1.对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
2.volatile前后的代码不能重排
就拿原子变量类的AtomicInteger来说:
/** * Atomically increments by one the current value. * * @return the previous value */ public final int getAndIncrement() { for (;;) { int current = get(); int next = current + 1; // 可能你会想,到这一步的时候,并没有加锁,那么所有的线程都可以修改啊!但是核心之处就在于下面那个CAS操作,结果会立马可见 if (compareAndSet(current, next)) // 比如说,线程A , B ,同时到达 next , A ,next = 2 B ,next = 2 , 然后A进CAS ,成功交换,B再进入,但是他会Compare当前值并 return current; //不会相等,所以操作会失败 } }
相关推荐
本篇文章将深入探讨如何使用`java.util.concurrent` 实现线程池队列,以及其中的关键概念和技术。 线程池是一种线程使用模式,通过预先创建并维护一定数量的工作线程来避免频繁创建和销毁线程的开销。在Java中,`...
本文主要分析的是基于`concurrent`包的一个特定线程池实现,探讨其实现原理和源码。 **线程池的基本原理** 线程池由几个核心参数控制:默认线程数、最大线程数和最小线程数。在启动时,线程池会创建默认数量的线程...
backport-util-concurrent项目最初由Doug Lea创建,他是Java并发领域的权威人物,他的贡献包括`java.util.concurrent`包的实现。这个库的核心目标是为那些无法升级到Java 5或更高版本的系统提供线程安全和并发控制的...
EBS java concurrent program的实现
标签 "源码" 提示我们可能会涉及Java并发库的底层实现,例如分析`java.util.concurrent`包中的类,如`ExecutorService`, `Semaphore`, `BlockingQueue`, `CountDownLatch`等的源代码。这些类在处理线程间通信、任务...
本文将深入探讨JavaScript中的一个特定库——Concurrent.Thread.js,以及它如何在JavaScript中实现多线程处理。 Concurrent.Thread.js是一款针对JavaScript设计的多线程插件,它的出现弥补了JavaScript原生不支持多...
1. **并发基础**: 在Java中,多线程是通过`Thread`类实现的,但`java.util.concurrent`包提供了一种更高级别的抽象,如`ExecutorService`和`Future`,这些使得并发控制更加灵活和高效。`ExecutorService`允许开发者...
Java并发编程是Java平台中的重要特性,它提供了一套强大且高效的工具,使得开发者能够创建多线程程序,实现高效并行处理。本资源“java concurrent 精简源码”着重关注Java并发库(java.util.concurrent)的核心概念...
6. **java.util.concurrent.atomic.AtomicReference** 类:这个类提供了原子操作的引用,允许在并发环境中安全地更新对象引用,是实现无锁数据结构的基础。 7. **license.txt** 文件:这个文件通常包含了软件的许可...
- **线程池管理**:Atlassian Util Concurrent库提供了一种定制化的线程池实现,允许开发者根据具体需求调整线程数量、任务队列策略等,从而有效地管理和控制并发执行的任务。 - **锁和同步机制**:库中包含了各种...
Java标准库中的`java.util.concurrent`包提供了线程池的实现,主要由`ExecutorService`接口和`ThreadPoolExecutor`类组成。`ExecutorService`定义了执行任务的接口,而`ThreadPoolExecutor`则是具体的线程池实现,...
`java.util.concurrent` 包中的 `BlockingQueue` 接口为实现生产者-消费者模型提供了一种优雅的方式。通过合理利用各种阻塞队列的实现,开发者可以在多线程环境中更好地管理数据流,提高系统的整体性能和响应速度。...
在JavaScript这样的单线程环境中,实现并发处理往往是一项挑战。然而,随着技术的发展,开发者们找到了在JS中利用多线程的方法,Concurrent.Thread就是一个这样的库,它允许我们在JavaScript中创建和管理多线程,...
j-concurrent 00 IBM developerWorks 中国 : Java 多线程与并发编程专题 02 Java 程序中的多线程 03 编写多线程的 Java 应用程序 04 如果我是国王:关于解决 Java编程语言线程问题的建议 (2) 05 构建Java并发...
开发者可以使用QWidgets、QML等组件来构建用户界面,使用QObject和QEvent体系结构进行事件处理,使用QNetworkAccessManager处理网络通信,使用QSqlDatabase进行数据库操作,以及使用QThread和Qt Concurrent实现多...
一、ConcurrentQueue内部结构: 1.实现原理 众所周知,在普通的非线程安全队列有两种实现方式: 1.使用数组实现的循环队列。 2.使用链表实现的队列。 先看看两种方式的优劣: .Net Farmework中的普通队列Queue的...
使用concurrent包可以实现以下功能: 并发控制:concurrent包提供了一些线程安全的集合类,如ConcurrentHashMap、ConcurrentLinkedQueue等,可以在多线程环境下安全地对集合进行操作,而无需手动添加同步机制。 ...
在.NET框架中,`ConcurrentQueue<T>`是一个线程安全的队列数据结构,它被设计用于多线程环境下的高效并发操作。这个类是System.Collections.Concurrent命名空间的一部分,提供了在多个线程读写数据时的安全性和性能...
在Java开发领域,Aduna Commons Concurrent库是一个重要的工具,它为开发者提供了丰富的并发处理工具和类,便于实现高效的多线程应用。这个名为"aduna-commons-concurrent-2.2.jar.zip"的压缩包,包含了Aduna ...
Oracle并发管理器(Concurrent Manager)是Oracle数据库系统中的一个重要组件,主要负责管理和调度数据库后台作业,确保在多用户环境中高效、稳定地运行各种并发任务。这个组件在Oracle E-Business Suite(EBS)等...