zoukankan      html  css  js  c++  java
  • volatile的理解和使用

    package thread;
    
    /**
     * Created by Administrator on 2017/1/15.
     */
    public class Counter {
        public volatile static int count = 0;
    
        public static void inc() {
    
    
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
            }
    
            count++;
            System.out.println(count);
        }
    
        public static void main(String[] args) {
    
            //同时启动1000个线程,去进行i++计算,看看实际结果
    
            for (int i = 0; i < 1000; i++) {
                new Thread(new Runnable() {
                    public void run() {
                        Counter.inc();
                    }
                }).start();
            }
    
            //这里每次运行的值都有可能不同,可能为1000
            System.out.println("运行结果:Counter.count=" + Counter.count);
        }
    
    }

    volatile工作中没用到过,买了本《java并发编程的艺术》,准备系统的学习下多线程.

    volatile是轻量级的synchronized,它能够在多处理器开发中保证了共享变量的“可见性”.

    可见性:当一个线程修改了一个共享变量时,另一个线程能够读到这个被修改该后的值.

    当一个被volatile修饰的共享变量的值发生改变,

    1.该值会从处理器缓存中写会到系统内存中.

    2.这个写回内存的操作会使得其他cpu里缓存了该内存地址的数据失效(为了提高处理速度,处理器不直接很内存进行通信,而是先将系统内存的数据读到内部缓存后再进行操作.).

    这个代码比较有趣:

    1.可将volatile删掉,然后发现,输出的结果,并没有1000,因为多个线程在同时对一个变量进行读写,造成有些读写没有保存下来.

    2.可以看到

    System.out.println("运行结果:Counter.count=" + Counter.count);
    这句代码最后输出的数不是1000,因为main函数直到执行结束,仍然还有线程在运行,main函数输出的count并不是最后的结果值.

    3.可以看到,当使用volatile后,虽然main函数输出的值仍然不是1000,但在打印出来的数据中可以搜到1000,说明共享变量确实是得到了想要的值,尽管不是最后一个打印出来的(这和代码中thread.sleep(1)有关系,还可能和线程切换,处理器时间片有关,我并不是很清楚),可以将thread.sleep代码去掉,可以得到按顺序输出的数值,最后输出的是1000.

    (多线程第一篇)

    
    
  • 相关阅读:
    Java中关键字优先级
    HashMap
    Mabatis通用SQL语句
    下滑线转换为驼峰
    常见问题整理
    常见问题整理
    VUE学习笔记(二)
    VUE学习笔记(一)
    获取鼠标位置
    VirtualBox NAT模式,设置虚拟机可上网,宿主机可访问虚拟机的方法
  • 原文地址:https://www.cnblogs.com/zqsky/p/6288185.html
Copyright © 2011-2022 走看看