针对volatile的解决方法?

package basic;


public class TestVolatile {


    public volatile static int count = 0;


    public static void increase() {

        try {

            // 延迟10毫秒,使得结果明显

            Thread.sleep(10);

            count++;

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }


    public static void main(String[] args) {

        for (int i = 0; i < 10000; i++) {

            new Thread(new Runnable() {


                @Override

                public void run() {

                    TestVolatile.increase();

                }

            }).start();

        }

        System.out.println("期望运行结果:10000");

        System.out.println("实际运行结果:" + TestVolatile.count);

    }

}

代码如下,由于volatile的read and load操作并不是原子性的,它只保证了从主内存读到栈内存的值是最新的,因此上述代码运行结果并不是语气的10000。

问题:

1.既然volatile并没有保证原子性,为什么还要使用它?

2.JDK中针对volatile的这种弊端,还做了哪些设计来弥补这一缺憾?


长风秋雁
浏览 483回答 4
4回答

白板的微信

你需要的是【锁】。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java