美文网首页
volatile关键字的理解

volatile关键字的理解

作者: 7i昂 | 来源:发表于2019-10-04 09:55 被阅读0次

先看下不加volatile关键字的例子

public class ThreadVerify {
    public static Boolean stop = false;
    public static void main(String args[]) throws InterruptedException {
        Thread testThread = new Thread(){
            @Override
            public void run(){
                int i = 1;
                while(!stop){
                    //System.out.println("in thread: " + Thread.currentThread() + " i: " + i);
                    i++;
                }
                System.out.println("Thread stop i="+ i);
            }
        }
        ;
        testThread.start();
        Thread.sleep(1000);
        stop = true;
        System.out.println("now, in main thread stop is: " + stop);
        testThread.join();
    }
}

运行结果


image.png

运行起来你会发现进入了死循环
纳闷了不是已经stop设成true了吗?为何还是循环呢?

因为工作线程开启之后把stop变量复制到工作内存当中也就是默认的false,主线程虽然1s之后设置true了但是设置的主内存的值,线程工作内存的值依然还是false导致一直死循环。
解决的方式就是stop变量前加一个volatile
因为加上volatile之后读写都是直接从主内存中的操作的,所以主线程设置true之后工作线程读的主内存的值也就是stop=true,自然也就跳出循环了。

public class ThreadVerify {
    public volatile static Boolean stop = false;
    public static void main(String args[]) throws InterruptedException {
        Thread testThread = new Thread(){
            @Override
            public void run(){
                int i = 1;
                while(!stop){
                    //System.out.println("in thread: " + Thread.currentThread() + " i: " + i);
                    i++;
                }
                System.out.println("Thread stop i="+ i);
            }
        }
        ;
        testThread.start();
        Thread.sleep(1000);
        stop = true;
        System.out.println("now, in main thread stop is: " + stop);
        testThread.join();
    }
}

运行结果


image.png

相关文章

  • 谈谈对Volatile的理解

    谈谈对Volatile的理解 带着BAT大厂的面试问题去理解volatile volatile关键字的作用是什么?...

  • volitle 与 LongAdder

    深入理解Java中的volatile关键字-HollisChuang’s Blog volatile volati...

  • 11-深入理解volatile关键字

    深入理解volatile关键字 我们对volatile这个关键字一定不陌生,或许也都用过。在Java 5之前,它是...

  • Java Volatile transient 关键字

    Java Volatile transient 关键字 java关键字volatile Volatile修饰的成员...

  • Java:深入理解volatile关键字

    前言 在Java中,volatile关键字十分重要 通过这篇文章,相信您对volatile关键字会更加理解 1. ...

  • volatile关键字

    原创文章,转载请注明原文章地址,谢谢! volatile关键字理解 volatile是Java提供的轻量级的同步机...

  • volatile

    volatile关键字private volatile int count; volatile关键字主要有三方面作...

  • 理解volatile关键字

    volatile关键字 当变量被某个线程A修改值之后,其它线程比如B若读取此变量的话,立刻可以看到原来线程A修改后...

  • Volatile关键字理解

    学习volatile关键字之前,先看一下并发编程中的一些概念 1 Java内存模型 解决线程通信和同步的两种方案 ...

  • volatile关键字理解

    volatile是Java提供的轻量级的同步机制,主要有三个特性: 保证内存可见性不保证原子性禁止指令重排序 1....

网友评论

      本文标题:volatile关键字的理解

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