Java基础 - volatile
volatile的作用:对与volatile修饰的变量,
1,保证该变量对所有线程的可见性。
2,禁止指令重排序。
Java内存模型(JMM)

原子性
i = 2; 把i加载到工作内存副本i,副本i=2,把 副本i 刷回主存。是原子的。
j = i; 从主存读 i和j 的副本到工作内存,把副本j=副本i,把副本j刷回主存。不是原子的。
i++; 即i=i+1;从主存读i的副本到工作内存,把副本i的值自增1,把副本i写回主存。不是原子的。
可见性
当一个变量被volatile修饰时,那么对它的修改会立刻刷新到主存,当其它线程需要读取该变量时(对于一条指令只读一次,比如i=i+1,读一次i;而while(flag) 每次判断只读一次,循环3次则读3次。这一点有助于理解volatile保证可见性却对非原子操作的指令i++无效),会去主存中读取最新值。
有序性
double pi = 3.14;//A
double r = 1; //B
double s= pi * r * r;//C
由于不会影响结果,JMM会对指令重排序,所以执行顺序可能是ABC,也可能是BAC,只要在单线程时不会影响结果。
假设某一指令有volatile变量,则该指令前的所有指令必然在该指令前执行,该指令后的所有指令必然在该指令后执行。
int a = 0;
bool flag = false; public void write() {
a = 2; //
flag = true; //
} public void multiply() {
if (flag) { //
int ret = a * a;//
}
}
假设线程1执行write,线程2执行multiply,ret的结果不一定是4.

如何保证i++原子性
1,syncronized,lock等(悲观锁)
2,CAS(乐观锁,比如使用AtomicInteger)
---
参考:
https://juejin.im/post/5a2b53b7f265da432a7b821c
https://www.cnblogs.com/zhengbin/p/5654805.html
Java基础 - volatile的更多相关文章
- java 基础 --- volatile
		问题 : volatile 解决的是什么问题 有什么应用场景 概述 某些共享变量的时候我们使用volatile 修饰,它会保证修改的值立即被更新到主存,或是从主存中获取最新的值.它的底层是如何实现的 ... 
- Java基础教程:多线程杂谈——双重检查锁与Volatile
		Java基础教程:多线程杂谈——双重检查锁与Volatile 双重检查锁 有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化.此时程序员可能会采用延迟初始化.但要正确实 ... 
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
		如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ... 
- 最适合作为Java基础面试题之Singleton模式
		看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ... 
- Java基础知识【下】( 转载)
		http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ... 
- Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)
		线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ... 
- Java基础常见英语词汇
		Java基础常见英语词汇(共70个) ['ɔbdʒekt] ['ɔ:rientid]导向的 ['prəʊɡræmɪŋ]编程 OO: object ... 
- java 基础题 很基础, 很有趣
		都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底, 老手们就不用进来了,免得笑话我们这些未出校门的孩纸们, ... 
- JAVA基础知识(转)
		本文就java基础部分容易混淆的一些知识点进行了一下总结.因为Java本身知识点非常多,不可能在很短的篇幅就能叙述完,而且就某一个点来讲,如欲仔细去探究,也能阐述的非常多.这里不做全面仔细的论述,仅做 ... 
随机推荐
- Python入门(一个有趣的画图例子实战)你肯定不会
			前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:qiu_fang 画一条可爱的python(蟒蛇): import t ... 
- windows程序设计00_HelloWorld
			#include <windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR sz ... 
- 利用Bootstrap搭建网站页面
			先来看下页面效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ... 
- rails 创建项目、创建controller、model等
			rails2之前创建新项目: rails3以及更高版本创建新项目:rails new webname 创建数据表model:rails g model user name:string sex:str ... 
- LNMP-Nginx负载均衡
			Nginx负载均衡介绍 Nginx提供负载均衡的模块upstream,这个模块是默认的,不需要重新编译模块.通常情况下,负载均衡一般用于后端两台机器同时提供服务供用户访问,但是用户经常访问的其中一台服 ... 
- 使用脚本安装 Docker
			使用脚本安装 Docker 1.使用 sudo 或 root 权限登录 Centos. 2.确保 yum 包更新到最新. $ sudo yum update 3.执行 Docker 安装脚本. $ c ... 
- 分享一个mysql服务启动与关闭的bat文件
			有时候打开数据库可视化工具(sqlyog.navicat)连接数据库时,会出现以下报错信息. 大家都知道是数据库的服务没有启动. 所以我想给大家分享一个bat文件可供快速启动mysql的数据库的服务, ... 
- 用函数式编程,从0开发3D引擎和编辑器(二):函数式编程准备
			大家好,本文介绍了本系列涉及到的函数式编程的主要知识点,为正式开发做好了准备. 函数式编程的优点 1.粒度小 相比面向对象编程以类为单位,函数式编程以函数为单位,粒度更小. 正所谓: 我只想要一个香蕉 ... 
- Linux服务器部署.Net Core笔记:二、安装FTP
			1.安装 安装ftp:yum install -y vsftpd 将ftp设置开机启动:systemctl enable vsftpd.service 2.配置 安装好后在ftp配置文件里进行配置 : ... 
- Cesium 限制相机进入地下
			有时我们在Cesium操作时,点击鼠标中间滚轮可更改视角,有时会使相机进入地下,导致体验很差,网上说了很多中方法,效果都不好或者没效果,下面是我翻了源码找到的方法,亲测有效.如有问题可按照专栏上的联系 ... 
