美文网首页
三段有意思的代码让你思考volatile和cpu缓存

三段有意思的代码让你思考volatile和cpu缓存

作者: XING辋 | 来源:发表于2017-07-25 12:42 被阅读0次

代码一

package main.java.mo.multithread.volatiletest;

public class CacheVolatile {
    private  int i = 0;

    public void write() {
        i++;
    }

    public int read() {
        while (i == 0) {

        }
        return i;
    }

    public static void main(String[] args) {
        CacheVolatile cacheVolatile = new CacheVolatile();

        Thread thread = new Thread(() -> {
            cacheVolatile.read();
        });
        thread.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        for (int i = 0; i < 10000; i++)
            cacheVolatile.write();

    }
}

代码二

package main.java.mo.multithread.volatiletest;

public class CacheVolatile {
    private  int i = 0;

    public void write() {
        i++;
    }

    public int read() {
        while (i == 0) {
            System.out.println(i);
        }
        return i;
    }

    public static void main(String[] args) {
        CacheVolatile cacheVolatile = new CacheVolatile();

        Thread thread = new Thread(() -> {
            cacheVolatile.read();
        });
        thread.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        for (int i = 0; i < 10000; i++)
            cacheVolatile.write();

    }
}

代码三

package main.java.mo.multithread.volatiletest;

public class CacheVolatile {
    private volatile int i = 0;

    public void write() {
        i++;
    }

    public int read() {
        while (i == 0) {
            
        }
        return i;
    }

    public static void main(String[] args) {
        CacheVolatile cacheVolatile = new CacheVolatile();

        Thread thread = new Thread(() -> {
            cacheVolatile.read();
        });
        thread.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        for (int i = 0; i < 10000; i++)
            cacheVolatile.write();

    }
}

分析

这三段代码执行结果自然各有差异,分析这三段代码可以让你理解volatile和缓存的知识点。

相关文章

  • 三段有意思的代码让你思考volatile和cpu缓存

    代码一 代码二 代码三 分析 这三段代码执行结果自然各有差异,分析这三段代码可以让你理解volatile和缓存的知识点。

  • 系统性能调优必知必会

    01 | CPU缓存:怎样写代码能够让CPU执行得更快? CPU缓存通常分为大小不等的三级缓存 我们的代码优化目标...

  • Java并发编程总结

    volatile实质是内存的可见性: cpu缓存包括:寄存器、L1、L2等,把线程的计算结果首先缓存在CPU缓存中...

  • JMM详解,volatile的作用

    背景 这段代码中过,thread done,是一定不会输出的,第一反应应该是原因是cpu缓存,增加volatile...

  • CPU Cache

    CPU Cache结构 CPU包含多个核心,每个核心又有独自的一级缓存(细分成代码缓存和数据缓存)和二级缓存,各个...

  • 大型项目优化的方向

    代码优化 ①开启opcode缓存,减少额外CPU和内存开销,加快代码运行速度(见文档《Opcode缓存》)②重模型...

  • 优化高效代码

    利用的就是CPU缓存要比内存访问速度更快的优点,提高代码运行速度就要提高cpu缓存命中率. 缓存命中率越高,代码性...

  • volatile 关键字(待续)

    参考资料 谈谈 C/C++ 中的 volatileC和C++中的volatile、内存屏障和CPU缓存一致性协议M...

  • java Thread深入了解(三)

    volatile 如下代码 第一个线程的死循环 并不会因为第二个线程的设置变量结束,这是因为cpu缓存的问题 如果...

  • java Thread深入了解(三)

    volatile 如下代码 第一个线程的死循环 并不会因为第二个线程的设置变量结束,这是因为cpu缓存的问题 如果...

网友评论

      本文标题:三段有意思的代码让你思考volatile和cpu缓存

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