美文网首页
volatile修饰符会破坏jvm优化么

volatile修饰符会破坏jvm优化么

作者: battle_ | 来源:发表于2017-07-12 17:01 被阅读31次

effective java第66条,同步访问共享变量的一个例子
例如

public class VolatileTest {
    private static boolean testBool;

    public static void main(String[] args) throws InterruptedException {
        Thread test = new Thread(new Runnable(){
            public void run(){
                int i = 0;
                while(!testBool){
                    i++;
                }
            }
        });
        
        test.start();
        TimeUnit.SECONDS.sleep(1);
        testBool = true;

    }

}

书中说虚拟机会将代码优化hoisting

if(!testBool){
  while(true) i++
}

而导致该进程操作无法停止

可以使用sync关键字同步读写testBool变量,从而达想要的通信效果

也可以使用volatile修饰符修饰testBool,该修饰符会强制线程复制的共享变量值一直为共享池中的最新值。
但是如果JVM仍然进行hoisting优化,效果应该是不正确的。而实际效果是正确的。可能是volatile修饰符强行终止了JVM优化。
volatile并不能实现同步互斥,只是让线程一直获取最新的共享内容,只能保证对单次读/写的原子性,像i++这种操作是读和写两次操作,读取i,对i+1,写入i。

测试发现,在i++后执行一个System.out.println("i" + i);内容也会发生VM没有进行优化操作,代码在主线程执行完赋值就终止了。
而且翻阅网络上的文章,发现VM使用client模式也不会复现优化后的场景,只有server模式VM才可以复现

相关文章

  • volatile修饰符会破坏jvm优化么

    effective java第66条,同步访问共享变量的一个例子例如 书中说虚拟机会将代码优化hoisting 而...

  • 互联网JAVA面试常问问题(三)

    一、volatile原理和使用场景 volatile 原理 volatile变量进行写操作时,JVM会向处理器发送...

  • Java之多线程和并发

    1.volatile变量 1.1 可见性 volatile修饰符保证volatile变量对所有线程可见,当一个线程...

  • Happens-Before 规则

    内存模型 Java内存模型规范了JVM如何提供按需禁用缓存和编译优化的方法 volatile关键字,它最原始的意义...

  • java并发编程(二)线程锁的应用

    一: Volatile关键字 概念: volatile是一个类型修饰符(type specifier).volat...

  • java面试题(101-110)

    101.jvm相关参数 102.lock ,sychronized,volatile的区别 一:volatile和...

  • jvm 相关阅读

    相关阅读 JVM性能优化1-JVM简介 JVM性能优化2-编译器 JVM性能优化3-垃圾回收 JVM性能优化4-C...

  • volatile与synchronized的区别

    一、volatile volatile的原理在java中,被volatile声明的关键字,jvm会在翻译的时候在c...

  • Java 并发——volatile

    JVM内存管理 概述 volatile 是轻量级的 synchronized。volatile 作用于共享变量,具...

  • JVM调优

    JVM(Java虚拟机)优化大全和案例实战 JVM 优化经验总结 JVM 数据存储介绍及性能优化 JVM诊断...

网友评论

      本文标题:volatile修饰符会破坏jvm优化么

      本文链接:https://www.haomeiwen.com/subject/vwdbhxtx.html