我正在阅读有关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);
}
}
答案 0 :(得分:1)
你的测试是错误的。
“并发窗口”非常小。在您的测试线程#2中可以看到来自线程#1的更改,也看不到。它被称为“数据竞赛”。我认为在这个测试中你需要更多的线程和更多的迭代。 OpenJDK使用jcstress进行此类测试。