volatile是java虚拟机提供最轻量级的同步机制。

volatile两个特性:1,保证同步的变量对所有线程是可见的。虽然对所有线程是即时可见的,但是却不保证原子性,也就是不保证线程安全,比如对于创建20个线程,每个线程都执行i++操作,执行100次,但是i输出的结果小于2000。因为一条i++用javap反编译是由4条指令来执行的。所以我们通过synchronized来保证原子性。 下面给出一个volatile适用的场景: 当shutdown()方法被执行时,保证所有线程中执行dowork()方法都立即停下来。

 volatile boolean    shutdownRequested;
public void shutdown(){
shutdownRequested = true;
}
public void dowork(){
while(!shutdownRequested){
``````````
}
}

2,禁止指令重排序优化。

先给出一个简单的例子

public class Singleton{
private volatile static Singleton instance;
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
  if(instance==null){
instance = new Singleton();
   }
}
}
return instance;
}
}
public static void main(String[] args){
Singleton.getInstance();
}

其中instance变量被赋值的部分执行了“lock addl $0x0,(%esp)”操作,这个操作相当于一个内存屏障(memory Barrier),重排序后的指令不能放到内存屏障之前的位置。

对原子性,可见性与有序性理解:

java内存模型是围绕着在并发过程中如何处理原子性、可见性与有序性这三个特性来建立的。

原子性:原子性操作包括,read、load、assign、use、store、和write。lock和unlock、synchronized块之间的操作也是原子性。

可见性:volatile,当一个线程修改了共享变量的值,其他线程能够立即得到这个修改的值。synchronized在变量执行unlock操作之前,必须先把此变量同步回主内存中和finally被finally修饰的字段在构造器中一旦初始化完成,并且构造器没有把this的引用传递出去,那在其他线程中都能看到finally字段。

有序性:volatile本身就有禁止指令重排序的语义,而synchronized则是由“一个变量在同一时刻只允许一个线程对其执行unlock操作”。

我们衡量并发线程安全的时候不要受到时间顺序的干扰,一切必须以,先行发生原则为准。

深入理解java虚拟机第五部分高效并发的更多相关文章

  1. 重读《深入理解Java虚拟机》五、虚拟机如何执行字节码?程序方法如何被执行?虚拟机执行引擎的工作机制

    Class文件二进制字符流通过类加载器和虚拟机加载到内存(方法区)完成在内存上的布局和初始化后,虚拟机字节码执行引擎就可以执行相关代码实现程序所定义的功能.虚拟机执行引擎执行的对象是方法(均特指非本地 ...

  2. 深入理解java虚拟机(五)垃圾收集器

    垃圾收集器 垃圾收集器是垃圾收集算法的具体实现.Java规范对垃圾收集器的实现没有做任何规定,因此不同的虚拟机提供的垃圾收集器可能有很大差异.HotSpot虚拟机1.7版本使用了多种收集器.如下图. ...

  3. (转)《深入理解java虚拟机》学习笔记10——并发编程(二)

    Java的并发编程是依赖虚拟机内存模型的三个特性实现的: (1).原子性(Atomicity): 原子性是指不可再分的最小操作指令,即单条机器指令,原子性操作任意时刻只能有一个线程,因此是线程安全的. ...

  4. (转)《深入理解java虚拟机》学习笔记9——并发编程(一)

    随着多核CPU的高速发展,为了充分利用硬件的计算资源,操作系统的并发多任务功能正变得越来越重要,但是CPU在进行计算时,还需要从内存读取输出,并将计算结果存放到内存中,然而由于CPU的运算速度比内存高 ...

  5. 深入理解java虚拟机---java虚拟机内存管理(五)

    1.深入理解java虚拟机 总图: 1.线程共享区: 2.线程独占区: 1.程序计数器 理解为当前线程锁执行的字节码的行号指示器,程序计数器没有内存异常错误.

  6. 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载

    <深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...

  7. jvm--深入理解java虚拟机 精华总结(面试)(转)

    深入理解java虚拟机 精华总结(面试)(转) 原文地址:http://www.cnblogs.com/prayers/p/5515245.html 一.运行时数据区域 3 1.1 程序计数器 3 1 ...

  8. 2018.4.23 深入理解java虚拟机(转)

    深入理解java虚拟机 精华总结(面试) 一.运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟机栈.本地方法栈.堆.程序计数器,其中方法区和堆是由线程共享的数据区,其他几个 ...

  9. 《深入理解java虚拟机》学习笔记之编译优化技术

    郑重声明:本片博客是学习<深入理解Java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序员有一个共识,以编译方式执行本地代码比解释方式更快,之所以有这样的共识,除去虚拟机解释 ...

随机推荐

  1. vue+element 递归上传图片

    直接上代码. <template>   <div>     <el-upload       action="http://localhost:3000/pic ...

  2. PHP-WebShell-Bypass-WAF

    PHP-WebShell-Bypass-WAF PHP WebShell 一句话的结构是:输入和执行,这是经典的PHP 一句话代码: <?php eval($_GET['test']); ?&g ...

  3. GoJS API学习

    var node = {}; node["key"] = "节点Key"; node["loc"] = "0 0";// ...

  4. JS写一个旋转木马的视频播放效果

    JS以及JQ的功能很强大,可以做出很多的优秀效果.今天给大家分享一个我之前写网站用到的旋转木马效果. 大概效果图就是这样的,上面的视频播放是旋转木马效果. 下面的音乐播放效果放在下一篇内容里面讲. 直 ...

  5. Android框架模式

    参考大佬写的文章:https://www.jianshu.com/p/f17f5d981de7 1.MVC模式 Model:模型层,负责处理数据的加载或存储 View:视图层,负责界面数据的展示,与和 ...

  6. 021、Java中汉子与数字的相互转换,利用字符变量保存中文

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  7. lpwizard 生成的 allegro 封装中 .psx 文件使用方法。

    lpwizard 有时候生成 allegro 封装的时候会生成 .psx 文件,这个文件其实是脚本文件,用于某些特殊形状焊盘的处理. 具体的使用方法如下: 在Allegro中,选择 File > ...

  8. c# quartz

    quartz调度核心元素: Scheduler:任务调度器,是实际执行任务调度的控制器.在spring中通过SchedulerFactoryBean封装起来. Trigger:触发器,用于定义任务调度 ...

  9. Docker 搭建开源 CMDB平台 “OpsManage” 之 Mariadb

    整理了一下文档  今天来构建mariadb 主机还是 centos  172.16.0.200 构建第二个images   直接shell.sh 完成  #!/bin/bash echo " ...

  10. POJ 3077 : Rounders

    Rounders Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7827 Accepted: 5062 Description ...