page contents

volatile关键字的使用结果与预期有出入

Pack 发布于 2020-02-21 17:42
阅读 459
收藏 0

volatile关键字的使用结果与预期有出入


需要执行的代码如下:


package com.example.mybatisplusdemo.generator;


import java.util.concurrent.TimeUnit;


/**

 * @author XLecho

 * Date 2019/8/3 0003

 * Time 15:56

 */

public class VolatileFoo {


    final static int MAX = 5;


    static volatile int init_value = 0;


    public static void main(String[] args) {


        new Thread(() -> {

            int localValue = init_value;

            while (localValue < MAX) {

                if (init_value != localValue) {

                    System.out.printf("The init_value is update to [%d]\n", init_value);

                    localValue = init_value;

                }

            }

        }, "Reader").start();


        new Thread(() -> {

            int localValue = init_value;

            while (localValue < MAX) {

                init_value = localValue;

                System.out.printf("The init_value will be changed to [%d]\n", ++localValue);

                try {

                    TimeUnit.SECONDS.sleep(2);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

            }

        }, "Updater").start();

    }


}


结果

预期的执行结果是两个线程都打印出5这个值,并正确结束。


实际结果是Updater打印出了5,但是Reader打印到4然后出现了死循环


怎么解释?

413
Pack
Pack

init_value = localValue;

System.out.printf(“The init_value will be changed to [%d]\n”, ++localValue);

与你这里写的有关系:init_value=4,localValue这里等于5,但是这里(localValue < MAX),不满足条件,所以init_value = localValue;这里不能赋值,最终init_value=4,Reader 里永远满足(localValue < MAX)所以死循环,这与线程的可见性没关系。

请先 登录 后评论