java中的volatile关键字错误[重复]

Posted

技术标签:

【中文标题】java中的volatile关键字错误[重复]【英文标题】:Volatile keyword error in java [duplicate] 【发布时间】:2015-06-03 03:26:28 【问题描述】:

我正在尝试编写一个简单的代码来理解 java 中的 volatile 关键字。

这个想法是使用两个线程来增加 Runner 类的 count 字段的值。 Helper 类实现了 Runnable,其中 run 方法增加 staticvolatilecount

        class Helper implements Runnable

            @Override
            public void run() 

                for(int i=0; i<100000;i++)         
                    Runner.count+=1;
                

            
        


        public class Runner 

            public static volatile long count=0; // to be incremented

            public static void main(String[] args)

                Thread t1 = new Thread( new Helper()); 
                Thread t2 = new Thread( new Helper());

                t1.start();
                t2.start();

                try 
                    t1.join();
                    t2.join();
                 catch (InterruptedException e) 
                    e.printStackTrace();
                

                System.out.println("Count= "+count); // output expected to be 200000
            

        

每次运行的预期输出是 Count= 200000 ,但有时我会得到不同的数字。 请帮助我了解这怎么可能

【问题讨论】:

Volatile 提供可见性,但不提供原子性(这是诸如变量增量之类的复合操作所需要的)。 【参考方案1】:

volatile 关键字的效果大约是对该变量的每个单独的读取或写入操作都是原子的。

然而,值得注意的是,需要多次读/写的操作——例如 i++,它相当于 i = i + 1,它执行一次读和一次写——不是原子的,因为另一个线程可能在读取和写入之间写入 i。

【讨论】:

【参考方案2】:
Runner.count+=1;

意思是:

Runner.count = Runner.count + 1;

或者,换句话说:

    获取Runner.count的值。 将此值加 1。 将新值存储在Runner.count

线程 A 和 B 都可以得到 Runner.count 的值(所以它们都得到 1),然后都同时给它加 1(所以它们都得到 2),然后都将它存储回在同一时间(所以新值是 2) - 现在值从 1 变为 2,而不是从 1 变为 3,即使两个线程增加了它!

【讨论】:

以上是关于java中的volatile关键字错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java中Volatile关键字详解

面试:说说Java中的 volatile 关键词?

java中volatile关键字的理解

Java中的volatile关键字

Java中的volatile关键字

java笔记java中的volatile关键字