Java:线程缓存

时间:2015-10-14 08:36:56

标签: java multithreading

我正在阅读有关volatile关键字和多线程的信息。所以我设计了一个小测试用例来检查volatile关键字的工作情况。 Docs说线程可能会缓存变量,因此可能不知道其他线程对变量所做的更改。我的程序更改了变量isRunning(非易失性),但两个线程仍然知道变量的变化并停止。

另外,我的陈述if(Thread.currentThread().getName().equals("T")){}是否有意义并以我假设工作的方式工作?

这是我的计划:

/**
* This program demonstrates the use of volatile keyword.
*
* Threads might cache variables if not marked volatile. Hence, cannot see changes
*/
class volatiled implements Runnable{
  private boolean isRunning;

  public void setisRunning(boolean value){
    this.isRunning = value;
  }

  public void run(){
    while(isRunning){
      try{
        Thread.sleep(1000);
      }catch(InterruptedException e){
         System.out.println("Error: "+e.toString());
      }

      if(Thread.currentThread().getName().equals("T")){
        // change is running
        this.isRunning = false;
      }

      System.out.format("Thread running: %s\n",Thread.currentThread().getName());
      if(Thread.interrupted()){
        System.out.format("Thread interrupted: %s\n",Thread.currentThread().getName());
        return;
      }
    }  
  }

  public static void main(String args[]){

    volatiled v = new volatiled();

    // set is running 
    v.setisRunning(true);

    Thread t = new Thread(v);
    Thread s = new Thread(v);

    // set thread names
    t.setName("T");
    s.setName("S");

    t.start();
    s.start();

    //stopThread(v);
  }

  private static void stopThread(volatiled v){
    v.setisRunning(false);
  }
}

1 个答案:

答案 0 :(得分:1)

你的测试是错误的。

“并发窗口”非常小。在您的测试线程#2中可以看到来自线程#1的更改,也看不到。它被称为“数据竞赛”。我认为在这个测试中你需要更多的线程和更多的迭代。 OpenJDK使用jcstress进行此类测试。