今天Tony来和大家聊聊Java中关键字volatile

字节码

首先volatile int a = 3;int a = 3;
加不加volatile关键字,最终生成的字节码都一样的。有兴趣的同学可以试试看看字节码是否一样。

英文解释

Adding volatile to the field does not change Java bytecode that reads or writes the field. It only changes the interpretation of the program by JVM or JIT compilation output if needed. It also influences optimizations.

中文理解

内存屏障的概念是针对CPU架构级别的,需要在JIT编译器生成机器码的时候才能看到。

java内存

讲讲java内存,在java内存中所有的变量都存在与主内存中,每个线程都有自己的工作内存。每个线程中的所用到的变量都是一个副本,都是从主内存中拷贝过来的。

在多线程的场景下,处于性能的考虑。每个线程处理变量的时候都会从主内存复制到当前的cpu缓存中,因为cpu缓存处理速度是相当的快。随之带来的问题就是一个变量被多个线程在不同的cpu中访问。

不同线程之间不能直接访问对方线程间的变量。他们之间的数据都传递都是通过主内存来实现的。


volatile关键字

java中用volatile 修饰的关键字将会标记在“主内存”中,每次对volatile变量的读取都是从计算机的主内存读取,不是从cpu缓存中读取。可以这么理解每次我都是取主内存里的数据。

同样对volatile变量的写入同时会写入到主内存和cpu缓存中。


不用volatile

举个例子,当线程T1对变量a进行写操作此刻a=1,如果此刻没有使用
volatile 关键字,那么此刻线程T2中的a还是等于0。
这个时候线程T2并不能读取到线程T1写的a=1,此刻线程T1并没有将a=1回写到主内存中去。

线程的可见性,就是上面说的这种情况。1个线程对变量进行操作并不会通知到另一个线程。

使用volatile内存可见性

public class VolatileObject {
  public volatile int a = 0;
}

上面代码当线程T1修改a的值,另一个线程T2读取a的自值,
在上面给出的场景中,一个线程(T1)修改计数器,另一个线程(T2)读取计数器(但从不修改),声明计数器变量volatile足以保证T2对计数器变量的写入可见。


指令重排序

1、重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。

2、调制执行语句的顺序,重排序是为了更好的提升性能。

3、重排序保证在单线程下不会改变执行结果,但在多线程下可能会改变执行结果。

举个例子

一定要你明白Java中的volatile的更多相关文章

  1. java中的volatile关键字

    java中的volatile关键字 一个变量被声明为volatile类型,表示这个变量可能随时被其他线程改变,所以不能把它cache到线程内存(如寄存器)中. 一般情况下volatile不能代替syn ...

  2. Java中的volatile关键字的功能

    Java中的volatile关键字的功能 volatile是java中的一个类型修饰符.它是被设计用来修饰被不同线程访问和修改的变量.如果不加入volatile,基本上会导致这样的结果:要么无法编写多 ...

  3. 深入理解Java中的volatile关键字

    在再有人问你Java内存模型是什么,就把这篇文章发给他中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized ...

  4. java中的Volatile关键字使用

    文章目录 什么时候使用volatile Happens-Before java中的Volatile关键字使用 在本文中,我们会介绍java中的一个关键字volatile. volatile的中文意思是 ...

  5. Java中的volatile关键字为什么不是不具有原子性

    Java中long赋值不是原子操作,因为先写32位,再写后32位,分两步操作,而AtomicLong赋值是原子操作,为什么?为什么volatile能替代简单的锁,却不能保证原子性?这里面涉及volat ...

  6. java中关键字volatile的作用

    用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...

  7. [读书笔记]java中的volatile关键词

    以下内容大多来自周志明的<深入理解Java虚拟机>. 当一个变量被volatile修饰后,它将具备两种特性: 1. 保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变 ...

  8. java中的Volatile 变量

    Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”:与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少, ...

  9. java中有关Volatile的几个小题

    1.java中能创建volatile数组吗? 能,java中可以创建volatile数组,不过只是一个指向数组的引用,而不是整个数组,如果改变引用指向的数组,将会受到volatile的保护,但是如果多 ...

随机推荐

  1. AFNetworkingErrorDomain 错误

    AFNetworking and POST Request I'm getting this response in error.userInfo while making a POST reques ...

  2. Mac 安装homebrew,pkgutil --pkgs列出安装包

    Mac 安装homebrew Homebrew官网 http://brew.sh/index_zh-cn.html Homebrew是神马 Linux系统有个让人蛋疼的通病,软件包依赖,好在当前主流的 ...

  3. Android教程 -07 Activity的任务栈和启动模式

    Activity是由任务栈管理的,一般情况下一个应用程序只有一个任务栈. 什么是栈? 栈是一种常用的数据结构,栈只允许访问栈顶的元素,栈就像一个杯子,每次都只能取杯子顶上的东西 栈的特点就是先进后出, ...

  4. PHP 试题(1)

    1.__FILE__表示什么意思?(5分)文件的完整路径和文件名.如果用在包含文件中,则返回包含文件名.自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一 ...

  5. supersockets服务器配置热更新

    Keywords: 配置,热更新 此功能能够允许你在不重启服务器的前提下更新服务器实例的配置. (仅限1.6.5及其以上版本)

  6. 原生sql和 TP sql怎么关联?

    整合后

  7. php Restful设计

    1.restful是基于资源的,面向资源架构风格(一个链接,一张图.一个文本等等) 2.restful的http协议 2.1 url: 2.1.1 port 服务端口,默认为80 2.1.2 path ...

  8. SAX解析xml (遍历DOM树各节点)

    本文参考 http://yangjunfeng.iteye.com/blog/401377 1. books.xml <?xml version="1.0" encoding ...

  9. Python--day60--web框架分类和wsgiref模块使用介绍

  10. pip安装python包时报字符编码错

    比如安装scikit-learn时报错: django ascii’ codec can’t encode character 原因是用户目录或用户名存在中文,ascii不能解码,解决办法是在Pyth ...