美文网首页
1.12 volatile关键字: 使得线程之间具有可见性, 从

1.12 volatile关键字: 使得线程之间具有可见性, 从

作者: 殊胜因缘_Chris | 来源:发表于2019-03-10 20:26 被阅读0次
/**
 * This is description.
 * 下面这段文字解释来自马士兵老师:
 * 
 * volatile关键字: 使得线程之间具有可见性, 从而进行缓存过期通知.
 * A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必知道
 * 使用volatile关键字,会让所有线程都会读到变量的修改值
 *
 * 在下面的代码中,running是存在于堆内存的t对象中
 * 当线程t1开始运行的时候,会把running值从内存中读到t1线程的工作区,在运行过程中直接使用这个copy,并不会每次都去
 * 读取堆内存,这样,当主线程修改running的值之后,t1线程感知不到,所以不会停止运行
 *
 * 使用volatile,将会强制所有线程都去堆内存中读取running的值
 *
 * 可以阅读这篇文章进行更深入的理解.(画图解释)
 * http://www.cnblogs.com/nexiyi/p/java_memory_model_and_thread.html
 *
 * volatile并不能保证多个线程共同修改running变量时所带来的不一致问题,也就是说volatile不能替代synchronized.
 * @author Chris Lee
 * @date 2019/3/5 22:10
 */
public class Demo {

    volatile boolean running = true;

    private void fun() {
        System.out.println("当前线程为" + Thread.currentThread().getName() + ": start!");
        while (running) {
            ///
            /*
            try {
                TimeUnit.MICROSECONDS.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            */
        }
        System.out.println("当前线程为" + Thread.currentThread().getName() + ": end!");

    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        new Thread(demo::fun, "t1").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 给running进行赋值
        demo.running = false;
        /*
            1) 没有volatile修饰running时, 打印结果:
                当前线程为t1: start!
            2) 有volatile修饰running时, 打印结果:
                当前线程为t1: start!
                当前线程为t1: end!
         */
    }
}
说明:
  • 本篇文章如有不正确或待改进的地方, 欢迎批评和指正, 大家一同进步, 谢谢!
  • 世上有4样东西可以让世界变得更美好, 它们是: 代码(Code), 诗(Poem), 音乐(Music), 爱(Love). 如有兴趣了解更多, 欢迎光顾"我的文集"相关文章.
资料:
  1. 学习视频: https://www.bilibili.com/video/av11076511/?p=1
  2. 参考代码: https://github.com/EduMoral/edu/tree/master/concurrent/src/yxxy
  3. 我的代码: https://github.com/ChrisLeejing/learn_concurrency.git

相关文章

  • 1.12 volatile关键字: 使得线程之间具有可见性, 从

    说明: 本篇文章如有不正确或待改进的地方, 欢迎批评和指正, 大家一同进步, 谢谢! 世上有4样东西可以让世界变得...

  • [098]技术-java volatile关键字原理解析

    volatile可见性 我们知道volatile关键字可以保证线程之间可见。什么叫可见性?即一个线程A修改的数据值...

  • volatile的原理和使用

    1.对线程的可见性 Java的volatile关键字声明使变量对不同线程具有可见性。程序在多线程操作non-vol...

  • Volatile关键字

    volatile 概念 volatile 关键字的主要作用是使变量在多个线程之间可见性。这里的“可见性”是指当一条...

  • java多线程关键字volatile

    volatile 线程间通信,使得被volatile修饰的变量具有可见性一个线程对变量的写一定对之后对这个变量的读...

  • voldatile和synchronized区别

    使用volatile关键字增加了实力变量在多个线程之间的可见性。但volatile关键字最致命的缺点是不支持原子性...

  • 线程间通信

    1. volatile关键字实现线程之间属性的可见性 2. 使用Object的notify(),notifyAll...

  • volatile关键字

    对volatile关键字的总结:volatile用来保证该变量对所有线程的可见性(从主内存加载到工作线程的值是最新...

  • volatile关键字的作用

    使用volatile关键字修饰的变量,保证了其在多线程之间的可见性,即每次读取到volatile变量,一定是最新的数据

  • volatile和synchronized的区别

    volatile volatile保证了多线程之间的可见性。用volatile修饰的变量,在多个线程中都可以读到最...

网友评论

      本文标题:1.12 volatile关键字: 使得线程之间具有可见性, 从

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