volatile(1)

2019-07-14  本文已影响0人  谁家的猪

volatile是Java虚拟机提供的轻量级的同步机制

volatile三大特性
  1. 保证可见性
  2. 不保证原子性
  3. 禁止指令重排序

volatile的可见性

可见性Demo

  1. 思路
    在AAA线程中修改MyData的number值,在main线程中观察值是否已经改变。
  2. 代码部分
/**
 * @author lijiayin
 */
public class VolatileDemo {

    public static void main(String[] args) {
        MyData myData = new MyData();
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName());
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            myData.to60();
            System.out.println("update");
        }, "AAA").start();
        
        while (myData.number == 0){
            
        }

        System.out.println("finish");
    }
}

class MyData{
    
    int number = 0;
    
    void to60(){
        number = 60;
    }
}
  1. 运行结果
    程序输出“update”后,一直在运行;main线程不知道此时number的值已经修改


    运行结果.png
  2. 将MyData的number加上volatile关键字
package com.interview.concurrency.example.thread;

/**
 * @author lijiayin
 */
public class VolatileDemo {

    public static void main(String[] args) {
        MyData myData = new MyData();
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName());
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            myData.to60();
            System.out.println("update");
        }, "AAA").start();
        
        while (myData.number == 0){
            
        }

        System.out.println("finish");
    }
}

class MyData{
    
    volatile int number = 0;
    
    void to60(){
        number = 60;
    }
}
  1. 运行结果
    程序在AAA线程更新number的值后,main线程发现了值的修改,程序结束。


    运行结果.png
  2. 结论
    volatile关键字修饰的属性,被修改并写回主内存时,其他线程都会收到通知,保证了对其他线程的可见性。
上一篇下一篇

猜你喜欢

热点阅读