今天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. Python--day64--内容回顾

    1,内容回顾 1.ORM外键操作 图书表和出版社表 多对一的关系 #书 class Book(models.Model): id = models.AutoField(primary_key=True ...

  2. pytorch实现BiLSTM+CRF用于NER(命名实体识别)

    pytorch实现BiLSTM+CRF用于NER(命名实体识别)在写这篇博客之前,我看了网上关于pytorch,BiLstm+CRF的实现,都是一个版本(对pytorch教程的翻译), 翻译得一点质量 ...

  3. Python--day40--threading模块的几个方法

    import time import threading #threading.get_ident() 查看当前进程号 def wahaha(n): time.sleep(0.5) print(n,t ...

  4. C# 7.2 通过 in 和 readonly struct 减少方法值复制提高性能

    在 C# 7.2 提供了一系列的方法用于方法参数传输的时候减少对结构体的复制从而可以高效使用内存同时提高性能 在开始阅读之前,希望读者对 C# 的值类型.引用类型有比较深刻的认知. 在 C# 中,如果 ...

  5. element el-table 添加分页连接的序号,清除sortable排序

    先看代码: <el-table :data="tableData" style="width: 100%" stripe size="mediu ...

  6. ZR10.1青岛集训三地联考

    ZR10.1青岛集训三地联考 谢谢dijk和smy A 题目大意: 已知斐波那契数列\(f\) 设 \[ F_i = \sum_{i = 0}^nf_if_{n - i} \] 求 \[ \sum_{ ...

  7. Linux 内核释放函数和 kobject 类型

    讨论中仍然缺失的一个重要事情是当一个 kobject 的引用计数到 0 时会发生什么. 创建 kobject 的代码通常不知道什么时候要发生这个情况; 如果它知道, 在第一位使用一个引 用计数就没有意 ...

  8. Vue的数据双向绑定和Object.defineProperty()

    Vue是前端三大框架之一,也被很多人指责抄袭,说他的两个核心功能,一个数据双向绑定,一个组件化分别抄袭angular的数据双向绑定和react的组件化思想,咱们今天就不谈这种大是大非,当然我也没到达那 ...

  9. Nutch网页抓取速度优化

    Nutch网页抓取速度优化 Here are the things that could potentially slow down fetching 1) DNS setup 2) The numb ...

  10. .net core允许跨域

    // 设置允许所有来源跨域 app.UseCors(options => { options.AllowAnyHeader(); options.AllowAnyMethod(); option ...