代码之家  ›  专栏  ›  技术社区  ›  Вардан Матевосян

java多线程程序中的可变变量

  •  0
  • Вардан Матевосян  · 技术社区  · 8 年前

    为什么多线程小程序中的原始变量表现为易变变量?请帮我输入代码。

    /**
     * Practice with threads problem visibility.
     * @author Matevosyan Vardan
     * @version 1.0
     * created on 21.09.2017
     */
    
    public class VisibilityProblem {
        private static int countingVal = 0;
    
        public static int getCountingVal() {
            return countingVal;
        }
    

    在main中启动

        public static void main(String[] args) throws InterruptedException {
           Thread looperR = new VisibilityProblem.Looper();
            Thread listener = new VisibilityProblem.Listener();
    
            listener.start();
            looperR.start();
    
            listener.join();
            looperR.join();
        }
    

    在睡眠500毫秒后,向wright学习并增加计数变量

        public static class Looper extends Thread {
            @Override
            public void run() {
                while (VisibilityProblem.countingVal < 5) {
                    VisibilityProblem.countingVal++;
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("increase " + VisibilityProblem.countingVal);
                }
            }
        }
    

        public static class Listener extends Thread {
            @Override
            public void run() {
                int localCount = VisibilityProblem.countingVal;
                while (localCount < 5) {
                    if (localCount != VisibilityProblem.countingVal) {
                        System.out.println("It is " + localCount + " now");
                        localCount = VisibilityProblem.countingVal;
                    }
                }
            }
        }
    }
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Stephen C    8 年前

    为什么在多线程小程序中,原语变量表现为易变变量

    表现为易变变量

    • 如果你的意思是,为什么在第二个线程中看到一个线程所做的更改。。。那么原因是JLS 允许这样做

    • 如果你的意思是,为什么更改是由一个线程完成的 在第二个线程中可以看到。。。那么你的程序没有提供证据 1.

    普通和 volatile 变量包括:

    • 不稳定的

    • 对于普通变量 也许 立即可见,或延迟可见,或。。。从不所有这些行为都符合Java内存模型。


    1-事实上,这是理论上的 不可能的 能够