我需要一些关于 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/