相关疑难解决方法(0)

java中volatile关键字的最简单易懂的例子

我正在阅读Java中的volatile关键字并完全理解它的理论部分.

但是,我正在寻找的是一个很好的案例,它展示了如果变量不是易变的话会发生什么.

下面的代码片段无法正常工作(来自aioobe)

class Test extends Thread {

    boolean keepRunning = true;

    public void run() {
        while (keepRunning) {
        }

        System.out.println("Thread terminated.");
    }

    public static void main(String[] args) throws InterruptedException {
        Test t = new Test();
        t.start();
        Thread.sleep(1000);
        t.keepRunning = false;
        System.out.println("keepRunning set to false.");
    }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,如果keepRunning不是volatile,则线程应该继续无限运行.但是,它会在几秒钟后停止.

我有两个基本问题: -

  • 任何人都可以用例子解释volatile吗?不是来自JLS的理论.
  • 是不稳定的替代同步?它是否实现了原子性?

java concurrency multithreading volatile

71
推荐指数
6
解决办法
7万
查看次数

为什么在双重检查锁定中使用volatile

Head First设计模式书中,具有双重检查锁定的单例模式已实现如下:

public class Singleton {
    private volatile static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么volatile被使用.volatile使用不会 破坏使用双重检查锁定的目的,即性能?

java singleton design-patterns locking double-checked-locking

70
推荐指数
3
解决办法
2万
查看次数

在java中同步确保其他线程的内存更新?

由于许多误解,我从头开始重新阐述了这个问题。提问的初衷没有改变。许多评论仍然引用旧的问题文本。

有关文档volatile指出,它确保其他线程以一致的方式看到内存更新。然而,volatile很少使用。

据我所知,synchronized块的目的是使线程不同时执行这些关键部分。是否也会synchronized像其他线程一样导致一致的内存更新volatile

java multithreading volatile

-2
推荐指数
1
解决办法
359
查看次数