java - java中 volatile 关键字的行为

标签 java multithreading

我需要一些关于 Java 线程的 Volatile 关键字的示例。

根据 volatile 关键字的定义,当变量被声明为 volatile 时,线程将直接读/写变量内存,而不是从本地线程缓存读/写。

如有错误,请指正。

因此,根据这种理解,当我运行以下程序时,

public class ThreadRunnableBoth implements Runnable{  
    private volatile int num =0;  

    public void run(){  
        Thread t = Thread.currentThread();  
        String name = t.getName();

        for(int i=0; i<100; i++){
            if(name.equals("Thread1")){
                num=10;
                System.out.println("value of num 1 is :"+num);
            }else{
                num=15;
                System.out.println("value of num 2 is :"+num);  
            }  
        }

    }  
    public static void main(String args[]) throws InterruptedException{  
        Runnable r = new ThreadRunnableBoth();  
        Thread t1 = new Thread(r);  
        t1.setName("Thread1");

        Thread t2 = new Thread(r);  
        t2.setName("Thread2");  

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

    }  
}  

我从某个网站获得了这些示例,当我尝试运行它时,我看不到删除 Volatile 或添加 Volatile 关键字有任何区别。

请解释一下删除它和添加它时发生的差异。

非常感谢。

最佳答案

是否有 volatile 关键字的主要区别在于是否需要内存栅栏来安全地操作数据。

内存栅栏可防止多个线程中由于无序执行而可能发生的副作用。通过指示CPU,编译器/运行时环境可以告诉CPU,在不破坏程序正确性的情况下,无法操纵读取的原始排序约束。

Read up on memory fences here ,并记住解决方案的关键是一致性,而不是位置。读请求可以在缓存处停止,前提是缓存保证一致(通过CPU的内部机制)。

关于java - java中 volatile 关键字的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9721553/

相关文章:

java - 如何更快地从 Selenium WebElement 获取值?

java - OpenJDK 10 和 Java SE 10 引用实现之间的区别

java - Android 应用程序关闭而不打开

java - 如何使用 xpathexpression 获取 <tr style ="">

multithreading - 为什么我的程序用一个核心而不是两个核心更快?

java - java线程间通信

java - 从教程中实现 Android TimePicker - Source Force Closes

java - 从视频中仅捕获一张缩略图

c++ - 在 Qt 中寻找 PostMessage 功能

java - 缓存一致性在无限循环演示中不起作用