聊聊并发(一)——深入分析Volatile的实现原理

2012 年 2 月 21 日

引言

在多线程并发编程中 synchronized 和 Volatile 都扮演着重要的角色,Volatile 是轻量级的 synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。

它在某些情况下比 synchronized 的开销更小,本文将深入分析在硬件层面上 Inter 处理器是如何实现 Volatile 的,通过深入分析能帮助我们正确的使用 Volatile 变量。

术语定义

术语

英文单词

描述

共享变量

复制代码
在多个线程之间能够被共享的变量被称为共享变量。共享变量包括所有的实例变量,静态变量和数组元素。他们都被存放在堆内存中,Volatile 只作用于共享变量。

内存屏障

Memory Barriers

是一组处理器指令,用于实现对内存操作的顺序限制。

缓冲行

Cache line

缓存中可以分配的最小存储单位。处理器填写缓存线时会加载整个缓存线,需要使用多个主内存读周期。

原子操作

Atomic operations

不可中断的一个或一系列操作。

缓存行填充

cache line fill

当处理器识别到从内存中读取操作数是可缓存的,处理器读取整个缓存行到适当的缓存(L1,L2,L3 的或所有)

缓存命中

cache hit

如果进行高速缓存行填充操作的内存位置仍然是下次处理器访问的地址时,处理器从缓存中读取操作数,而不是从内存。

原文链接:【 https://www.infoq.cn/article/ftf-java-volatile 】。未经作者许可,禁止转载。

登录后可解锁全站优质内容

免费畅享技术公开课、顶尖技术团队访谈、一线互联网大厂技术实践

文章
视频
电子书
研究报告
立即登录
2012 年 2 月 21 日 00:00 107086

评论 1 条评论

发布
用户头像
PaddedAtomicReference 1.8里好像没有了、
2018 年 11 月 08 日 19:46
回复
没有更多评论了
  • 深入理解 Java 内存模型(一)——基础

    Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,本文试图揭开Java内存模型神秘的面纱。本文大致分三部分:重排序与顺序一致性;三个同步原语(lock,volatile,final)的内存语义,重排序规则及在处理器中的实现;Java内存模型的设计目标,及其与处理器内存模型和顺序一致性内存模型的关系。

  • 内存篇:如何减少延迟提升内存分配效率?

    我们开发的应用程序对内存的分配请求延迟的期盼,就是要动作飞快。

    2020 年 1 月 1 日

  • 深入理解 Java 内存模型(五)——锁

    Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,本文试图揭开Java内存模型神秘的面纱。本文大致分三部分:重排序与顺序一致性;三个同步原语(lock,volatile,final)的内存语义,重排序规则及在处理器中的实现;Java内存模型的设计目标,及其与处理器内存模型和顺序一致性内存模型的关系。

  • 聊聊 Java 并发——基石篇(上)

    本文介绍Java并发的设计基础。

  • sync.Mutex 与 sync.RWMutex

    虽然Go语言是以“用通讯的方式共享数据”为亮点的,但是它依然提供了一些易用的同步工具。其中,互斥锁是我们最常用到的一个。

    2018 年 10 月 10 日

  • Java 内存模型:看 Java 如何解决可见性和有序性问题

    Java的内存模型是并发编程领域的一次重要创新,也是职场面试中的热门考点。它可以解决可见性和有序性导致的问题。

    2019 年 3 月 2 日

  • 内存模型和 atomic:理解并发的复杂性

    这一讲介绍的底层概念,是在 C++ 里写出高性能并发代码的基础。

    2020 年 1 月 10 日

  • 聊聊并发(五)——原子操作的实现原理

    原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。

  • 原子操作和竞争

    本文是上次:http://www.infoq.com/cn/articles/cache-coherency-primer的第二篇。第一篇刊出后受到了很多转发,反响非常好。主题依然是内存操作方面的。

  • Netty 系列之 Netty 并发编程分析

    Java技术领域,网络通信和多线程并发编程是相对较高级和难掌握的领域,作为高性能的NIO通信框架,线程模型对Netty的性能影响非常大,Netty的高性能是建立在灵活和高效的并发编程基础之上。通过学习Netty的多线程并发编程技巧,对于我们掌握并在实践中灵活应用Java多线程编程来提升系统性能带来很大的帮助。

发现更多内容

GO 语言超时实现

Dnnn

go

聊聊开发工程师如何转型产品经理

长沙造纸农

程序员 开发者 产品经理 转型 中年危机

教师节送什么老师最开心?程序员三招解决家长送礼难题!

华为云开发者社区

编程 程序

遇到银河提现不了网站维护审核怎么办?

丛林里的余光

数据库 网站平台 提现

马云:今天的区块链并没有被人们认识到价值!

CECBC区块链专委会

区块链 阿里巴巴 马云

Redis哨兵(sentinel )机制讲解

Dnnn

bit比特, Byte字节,基础知识

Dnnn

分布式追踪系统原理看不懂,40张图带你亲手实践

小Q

Java 架构 面试 分布式 系统设计

或许是史上最好的AQS源码分析了,AQS基础一

InfoQ_d2212957090d

AQS

Go语言 sync.Mutex 源码分析

Dnnn

go

起飞!这份技术点拉满的ELk+Lucene笔记,可能价值百万

小Q

Java lucene elasticsearch 架构 面试

实战解析丨如何对Mysql连接请求的tcpdump内容进行分析

华为云开发者社区

TCP/IP 数据传输

MYSQL中时间类型底层存储,DATETIME ,TIMESTAMP,INT 如何选择?

Dnnn

Linux命令netstat详解

Dnnn

【API进阶之路】用API打造一条自动化内容生产流水线

华为云开发者社区

自动化 API 部署

Centos 上配置大数据环境

yuanhang

大数据

URL 去重的 6 种方案!(附详细实现代码)

王磊

Java

anyRTC推流小助手-客户端推流(PUSH RTMP)工具

anyRTC开发者

技术 音视频 WebRTC 直播 RTC

程序员快乐器之JAVA代码生成工具

Learun

敏捷开发 快速开发 生成代码

学完微软技术总监整理的44 个微服务架构设计模式,我涨薪了

Java架构师迁哥

初识大数据

yuanhang

大数据

GO语言 MD5 四种实现方式

Dnnn

go

算法与数据中台实践之网约车平台

博文视点Broadview

大数据 数据中台 中台 算法 数据

GO 语言异常处理

Dnnn

go

居然有人仅凭这份《Java面试宝典》就成功拿到了阿里、京东、字节跳动等大厂offer

Java成神之路

Java 编程 程序员 面试

阿里架构师耗时三个月整理的Spring实战笔记:入门到实战

Java架构师迁哥

GO 语言交叉编译

Dnnn

go

epoll的原理和流程

Dnnn

理解大端字节和小端字节

Dnnn

TCP三次握手和四次挥手

Dnnn

如何设计Upload组件思考

赵孔磊

聊聊并发(一)——深入分析Volatile的实现原理-InfoQ