volatile修饰符会破坏jvm优化么

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才可以复现

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,972评论 11 349
  • 1. 仿写汪增祺《八千岁》中的一段话,表达自己的某一种浓烈的情感。 “前头”没有什么事的时候,他就到后面看看。进了...
    简单369阅读 357评论 1 0
  • 走出混沌的方法就是问自己有个什么理由、求个什么结果。 已然的事不能成未然,未然的事尚能把握在自己手中。 求什么结果...
    君心向水royal阅读 680评论 0 0
  • 在人生前半程,我觉得我的命运是傻乎乎的过,为了一个个不喜欢自己的人喝醉过,也为了一个不喜欢自己的人努力过,努力活成...
    米奇小姑娘阅读 398评论 0 0

友情链接更多精彩内容