【问题标题】:Test volatile variable in java在java中测试volatile变量
【发布时间】:2018-04-07 01:17:18
【问题描述】:

我编写了一个简单的程序来测试 volatile 变量。至于我在 t2 运行时编写的程序,它应该选择 i 的值为 3,并且永远不应该进入 while 循环

但它输出 0 1 2 0 1 2 因为它是不稳定的,它不应该只打印 0,1,2 吗??

public class Test{
     public static void main(String []args) throws InterruptedException{      
          TestVolatile t1 = new TestVolatile();
          t1.start();
          t1.join();
          TestVolatile t2 = new TestVolatile();
          t2.start();  
     }
}

class TestVolatile extends Thread{
    volatile int i = 0;  
    public void run(){
        while(i < 3){
            System.out.println(i);
            i++;
        }
    }   
}

【问题讨论】:

  • 说真的:如果你不明白你需要 static 在这里,那么你试图了解 volatile 和线程以及什么不是......就像非常低效。首先学习基础知识。然后是高级的东西。

标签: java jakarta-ee data-structures core


【解决方案1】:

您正在创建 2 个不同的 TestVolatile 对象,每个对象都有自己的变量 i 并且只能使用它。所以第一个对象递增并输出 0、1、2,第二个对象也是如此。

你需要像这样使i静态

static volatile int i = 0; 

【讨论】:

  • 即便如此,请注意i++ 不是线程安全的,即使i 是易失的。我现在正在打电话,所以我不能轻易检查,但搜索“Java volatile increment”或类似内容可能会给你原因。
  • @yshavit,因为在join() 之后启动第二个线程,所以会有发生之前的关系。所以volatile 在这种情况下完全可以省略。
【解决方案2】:

由于 2 个线程正在访问 i 变量的 2 个副本,因此您得到了输出。

将 i 变量设为静态 -

static volatile int i = 0;

更多信息 - https://www.javacodegeeks.com/2018/03/volatile-java-works-example-volatile-keyword-java.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多