博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发--concurrent包的实现
阅读量:2444 次
发布时间:2019-05-10

本文共 752 字,大约阅读时间需要 2 分钟。

concurrent包的实现

由于Java的CAS同时具有volatile读和volatile写的内存语义,因此Java线程之间的通信现

在有了下面4种方式。

  1. A线程写volatile变量,随后B线程读这个volatile变量。
  2. A线程写volatile变量,随后B线程用CAS更新这个volatile变量。
  3. A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量。
  4. A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量。

Java的CAS会使用现代处理器上提供的高效机器级别的原子指令,这些原子指令以原子方式对内存执行读-改-写操作,这是在多处理器中实现同步的关键(从本质上来说,能够支持原子性读-改-写指令的计算机,是顺序计算图灵机的异步等价机器,因此任何现代的多处理器都会去支持某种能对内存执行原子性读-改-写操作的原子指令)。同时,volatile变量的读/写和CAS可以实现线程之间的通信。把这些特性整合在一起,就形成了整个concurrent包得以实现的基石。如果我们仔细分析concurrent包的源代码实现,会发现一个通用化的实现模式。

  • 首先,声明共享变量为volatile。
  • 然后,使用CAS的原子条件更新来实现线程之间的同步。
  • 同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信。

AQS,非阻塞数据结构和原子变量类(java.util.concurrent.atomic包中的类),这些concurrent包中的基础类都是使用这种模式来实现的,而concurrent包中的高层类又是依赖于这些基础类来实现的。从整体来看,concurrent包的实现示意图如下所示:

在这里插入图片描述

转载地址:http://oypqb.baihongyu.com/

你可能感兴趣的文章
react hooks使用_使用React Hooks将React类组件转换为功能组件的5种方法
查看>>
使用Node.JS,React,Redux和Redux-saga Part3:身份验证构建Retrogames存档
查看>>
使用Node.JS,React,Redux和Redux-Saga Part2:Redux集成构建Retrogames存档。
查看>>
使用Selenium WebDriver测试Flask应用程序-第1部分
查看>>
python circle_与Python和Circle CI的持续集成
查看>>
react apollo_React with Apollo中的实时GraphQL UI更新。
查看>>
express react_在30分钟内使用Express.js构建博客并进行React
查看>>
构建express_15分钟内在Express中构建简单身份验证
查看>>
覆盖vue.js样式_使用Vue.js和Cloudinary在化身上覆盖眼镜/面罩
查看>>
js 迭代器 异步_异步迭代器和生成器入门
查看>>
vs 部署 azure_使用VS Code的Azure函数入门:零部署
查看>>
graphql-go_GraphQL-好与坏
查看>>
bitcoin_使用Node,Coinbase,Bitcoin和Okta构建自己的发票服务
查看>>
filestorm超级节点_带有节点的超级简单GraphQL
查看>>
vue避免使用mixins_用Mixins扩展Vue组件
查看>>
api curl_具有cURL和JavaScript的Airtable API教程
查看>>
代码打字速度_使用VueJS创建打字速度效果
查看>>
casl库控制用户权限_使用CASL在Vue中管理用户权限
查看>>
css 汉堡菜单_使用CSS构建变形汉堡包菜单
查看>>
javascript运算符_JavaScript一元运算符:简单而有用
查看>>