线程安全的理论讲解(volatile)
参考:http://blog.csdn.net/xieyuooo/article/details/8639190
在J U C里面,要谈到并发,就必然就存在可见性问题,其实对于程序来讲,要说到锁,首先要确保可见性,也就是要在这个基础上才能做到,而CAS也是基于这种原理来完成,我们在文章:Java JUC之Atomic系列12大类实例讲解和原理分解 中关于Atomic的介绍中有提到通过unsafe调用底层的compareAndSwapXXX的三个方法,都是基于可见性变量才会有效。
谈到可见性,首先要明白一下内存和CPU以及多个CPU之间数据修改的基本原理,我们不要谈及CPU上太深的东西,我只需要明白,要将数据进行运算,就需要将数据拷贝到CPU上面去计算,那么就会有内存和CPU之间的通信、CPU的计算、写回到内存一些动作,此时基于线程的私有栈中会保存这些数据;而可见性会体现在:当另一线程对共享数据进行修改的时候,另一个线程未必能看到或者未必能马上看到这个数据。那什么叫看到这个数据呢?说起来蛮抽象的,并且这些情况通常不好模拟,在不同的CPU下也会模拟出来不同的效果或者根本模拟不出来(所以本文只会给出很多理论,因为给你的代码你可能会认为他们是无法将场景实现的),我们下面用简短的一段例子描述下大概:
当一个线程创建多个子线程去做很多任务的时候,在每个子线程内部的都有一个状态区域设置(例如:初始化、运行中、执行完成、执行失败等),主线程会不断去读取子线程的状态,从而做进一步的操作;上面所提到的可见性就是体现在当主线程去读取子线程的数据的时候,有可能会导致数据的还是“老”的值或“失效”的值的情况,但是并不是任何时候都出现,只是一些偶然的情况会发生,由于某些CPU的优化或当JVM被调节为-server模式下运行时,允许很多信息被优化后才会发生;所以你经常在本地调试一些并发程序发生没有什么问题,当你发布到server下后,经常会出现一些稀奇古怪的问题,这是为什么呢,程序的优化和CPU的优化,它认为这里应该是安全的,可以被优化或转换,如果你不想让他变化,你就需要告诉他们,你的数据是存在多线程安全隐患的。
文章中会介绍很多关于线程安全的知识理论分享,也许你第一遍看下来头晕脑胀,但是通过理解后再看看,也许你就会有很多自己的理解,从而在多线程编程时对于线程的安全有新的认识。
线程安全的理论讲解(volatile)相关推荐
- 并发编程-06线程安全性之可见性 (synchronized + volatile)
文章目录 线程安全性文章索引 脑图 可见性定义 导致不可见的原因 可见性 -synchronized (既保证原子性又保证可见性) 可见性 - volatile(但不保证操作的原子性) volatil ...
- volatile能保持线程安全吗_从volatile说到i++的线程安全问题
一般说来,volaTIle用在如下的几个地方: 1.中断服务程序中修改的供其它程序检测的变量需要加volaTIle: 2.多任务环境下各任务间共享的标志应该加volaTIle: 3.存储器映射的硬件寄 ...
- MPC控制器设计,模型预测控制,线性时变模型预测控制,LTV MPC,提供理论讲解与应用实现
MPC控制器设计,模型预测控制,线性时变模型预测控制,LTV MPC,提供理论讲解与应用实现. 提供MPC算法.LTV MPC 算法在直升机和四旋翼中的应用实例. 提供模型预测控制资料. 提供matl ...
- 无迹(损)卡尔曼滤波(UKF)理论讲解与实例
无迹(损)卡尔曼滤波(UKF)理论讲解与实例 文章目录 无迹(损)卡尔曼滤波(UKF)理论讲解与实例 理论讲解 模型对比 UT变换 UKF算法步骤 预测部分 更新部分 应用实例 CTRV模型 预测处理 ...
- DCGAN理论讲解及代码实现
目录 DCGAN理论讲解 DCGAN的改进: DCGAN的设计技巧 DCGAN纯代码实现 导入库 导入数据和归一化 定义生成器 定义鉴别器 初始化和 模型训练 运行结果 DCGAN理论讲解 DCGAN ...
- 扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)
扩展卡尔曼滤波(EKF)理论讲解与实例(matlab.python和C++代码) 文章目录 扩展卡尔曼滤波(EKF)理论讲解与实例(matlab.python和C++代码) 理论讲解 KF和EKF模型 ...
- 深入浅出Java线程池:理论篇
前言 很高兴遇见你~ 借助于很多强大的框架,现在我们已经很少直接去管理线程,框架的内部都会为我们自动维护一个线程池.例如我们使用最多的okHttp以及他的封装框架Retrofit,线程封装框架RxJa ...
- Java线程安全 关于原子性与volatile的试验
1. 变量递增试验 1 static /*volatile*/ int shared=0;//volatile也无法保证++操作的原子性 2 static synchronized int incrS ...
- 集群理论讲解(续三)
三.RHCS的corosync组件实现HA(高可用). 1.pacemaker作为corosync的插件运行 搭建环境: ms.dtedu.com:管理HA的站点(ansible) node5.dte ...
最新文章
- 【B/S实践】IIS发布
- 05. 取SQL分组中的某几行数据
- Linux基础命令的操作(时间与日期,日历,计算器)
- 运维笔记--postgresql占用CPU问题定位
- 使用Rainbow tables和Ophcrack的组合工具破解Windows密码
- java socket 包头包体_使用JAVA上抓取Socket服务端和客户端通信TCP数据包
- 得到节点值的两种方法
- 智慧气象 开源_来自开源的半条命11条智慧
- KG—ARM-Thumb子程序调用规则—ATPCS
- 寒武纪讯飞京东等合搞AI芯片评测标准,作者包括陈云霁陈天石
- android使用地图编程,基于Android实现百度地图定位过程详解
- VMWare Network Adapter设置错误也会导致 Determining IP information for eth0 failed
- tar bz2 解压
- JAVA毕业设计飞羽羽毛球馆管理系统计算机源码+lw文档+系统+调试部署+数据库
- js文档模式之混杂模式与标准模式
- java图片加气泡文字,动态图片加气泡文字 微信动态图片加文字教程
- 4个技巧,Linux 下让工作效率翻倍!
- 中国制造挽救了特斯拉,否则它就被大众超越了
- 《寒假去世十 第八章》
- 【Qt】.qrc文件为项目添加图片、动画、音效、视频等资源文件