在讲volatile关键字之前我们先了解Java的内存模型,Java内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存。线程对变量的所有操作都必须在自己的工作内存中进行,而不能直接对主存进行操作。各线程间的工作内存互不干扰。

谈一下你对 volatile 关键字的理解?( volatile 的作用是什么?)

答:volatile 是 Java 虚拟机提供的最轻量级的同步机制。当变量被定义成 volatile 之后,具备两种特性:

(1)保证对变量操作的可见性.

(2)禁止指令重排序优化.

注意:不保证原子性

怎么理解原子性,可见性和指令重排?

原子性:程序中的所有操作是不可中断的,要么全部执行成功要么全部执行失败。

可见性:指当多个线程访问同一个变量时,如果其中一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

指令重排:为了提高程序运行效率,可能会对输入指令进行重新排序,即程序中各个语句的执行先后顺序同代码中的顺序不一定一致。(但是它会保证单线程程序最终执行结果和代码顺序执行的结果是一致的)

可见性,指令重排实例:

https://www.cnblogs.com/qdhxhz/p/9179725.html

哪些地方用到过volatile

1、单例模式(双重检验锁DCL)

菜鸟教程--https://www.runoob.com/design-pattern/singleton-pattern.html

2、读写锁手写缓存

3、CAS JUC包中大量使用volatile

volatile底层的实现机制?

如果把加入volatile关键字的代码和未加入volatile关键字的代码都生成汇编代码,会发现加入volatile关键字的代码会多出一个lock前缀指令。

lock前缀指令实际相当于一个内存屏障,内存屏障提供了以下功能:

1 . 重排序时不能把后面的指令重排序到内存屏障之前的位置

2 . 使得本CPU的Cache写入主存

3 . 写入动作也会引起别的CPU或者别的内核无效化其Cache,相当于让新写入的值对别的线程可见。

Synchronized与volatile区别

(1) synchronized即保证了数据的可见性也保证了原子性,volatile能保证对变量操作的可见性,但不能完全保证原子性。比如,i++ 如果使用 synchronized 修饰是线程安全的,而 volatile 会有线程安全的问题。

(2) volatile只能修饰变量,synchronized可以修饰变量,方法以及代码块。

(3) volatile在多线程中不会存在阻塞问题,synchronized会存在阻塞问题。

(4) volatile解决的是多个线程之间对变量操作的可见性,而synchroized解决的是多个线程之间访问资源的同步性。

参考

面试官必问的8道volatile关键字命题,你答对了吗?

https://blog.csdn.net/l18848956739/article/details/88660353

进行重新排序

并发编程--锁--volatile的更多相关文章

  1. Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  2. (转)Java并发编程:volatile关键字解析

    转:http://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或 ...

  3. Java 并发编程:volatile的使用及其原理

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  4. Java并发编程:volatile关键字解析(转载)

    转自https://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析   Java并发编程:volatile关键字解析 ...

  5. Java并发编程:volatile关键字解析-转

    Java并发编程:volatile关键字解析 转自海子:https://www.cnblogs.com/dayanjing/p/9954562.html volatile这个关键字可能很多朋友都听说过 ...

  6. 6、Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  7. 转:Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字, ...

  8. [转载]Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  9. java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock

    原文:java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock 锁 锁是用来控制多个线程访问共享资源的方式,java中可以使用synch ...

随机推荐

  1. 自己整理了一个 Dapper的Helper助手类

    链接字符串配置: <connectionStrings> <add name="db" connectionString="server=.;datab ...

  2. Codeforces Round #682 Div2 简要题解

    Contest link A.Specific Tastes of Andre Problem link 题意 构造一个长度为 \(n\) 的序列,使得每个非空子序列的和都被其长度整除. 思路 直接每 ...

  3. Codeforces Edu Round 64 A-D

    A. Inscribed Figures 分类讨论打表即可. PS:这道题翻译有歧义. 这样稍微翻转一下,就可以是\(7\)个交点呀...(大概是我没看英文题干导致的惨案) #include < ...

  4. pyppeteer 登录一般网站 并利用 http方法获取登录页面的验证码

    主函数 新建浏览器,进行登录,由于验证码的识别准确率不是百分之百,需要多次尝试. async def main(self, username, pwd, url): # 定义main协程函数, log ...

  5. Docker 安装并部署Tomcat、Mysql8、Redis

    1.  安装前检查 1 #ContOS 7安装Docker系统为64位,内核版本为3.10+ 2 lsb_release -a 3 4 uname -r 5 6 #更新yum源 7 yum -y up ...

  6. 解决python3 ,ModuleNotFoundError: No module named 'pip'问题

    今天想要装一下PyYmal第三方库来写一下Python的desired_caps.yaml文件,候发现cmd窗口下无法执行pip命令, 出现了:ModuleNotFoundError: No modu ...

  7. PHP字符串你不知道的事

    PHP常见的定义字符串的方式有那些? 1.单引号 在单引号中,任何特殊字符都会按原样输出[除\.\'将会被转义输出],不是什么都不解析的,这是很多人的误解 echo 'this is a var!'. ...

  8. JUC(一):volatile关键字

    volatile是什么 ​ volatile是java虚拟机提供的轻量级同步机制,它包含三种特性: 保证可见性:只要主内存中变量做出修改,其余线程马上会感知到变量的修改. package com.ch ...

  9. Java8中执行js脚本

    代码中除了callJSFunctionFromFile函数,其他均转载于文章JDK1.8中如何用ScriptEngine动态执行JS import jdk.nashorn.api.scripting. ...

  10. maven中引入jstl

    <!--jsp标签--> <dependency> <groupId>taglibs</groupId> <artifactId>stand ...