首页 > 其他 > 详细

volatile 关键字的理解以及使用

时间:2021-05-23 23:04:56      阅读:19      评论:0      收藏:0      [点我收藏+]

1、volatile 关键字的作用

    /**
     *  volatile 关键字的作用
     *  1、volatile 是弱化版的synchronized
     *  2、保证可见性(多个线程操作同一个变量,不同 的线程能共享变量,一个线程修改了值,另一个线程能看到)
     *  3、不保证原子性(原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。)
     *  多个线程操作一个变量,其中一个线程操作的时候可能会被别的线程插队。
     *
     */

2、volatile 关键字的可见性

代码中的num 如果不用volatile修饰那么循环会一直执行下去的

/**
 *  保证可见性的例子
 */
public class JMMDemo {
    private volatile static int num = 0;
    public static void main(String[] args) { //这是一个线程

        new Thread(()->{  // 如果这里 使用的num不用volatile 修饰,这个线程里面的循环会一直执行
            while (num == 0){}
        },"gao").start();

        try{
            TimeUnit.SECONDS.sleep(2);
        }catch (InterruptedException e){
        }
        num = 1;      //主线程修改值
        System.out.println(num);
    }
}

3、volatile不保证原子性的例子

//输出的结果大概率不是 10000

public class JMMDemo2 {
    private static  int num = 1;
    
    public static void add(){
        num ++;
    }
    
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                for (int j = 0; j < 1000; j++) {
                   add();
                }
            },"sss").start();

        }
        if(Thread.activeCount()>2){ //如果存活的线程数大于2
            Thread.yield();
        }

        System.out.println(num);
    }
}

 

volatile 关键字的理解以及使用

原文:https://www.cnblogs.com/gaohq/p/14802056.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!