易失多线程数据不一致

时间:2013-05-25 13:42:09

标签: java multithreading volatile

我以为我已经采取了必要的措施来防止数据争夺,但似乎它没有起作用......

我编写了一个分层状态机来实现一个硬币测验游戏。 鉴于刚刚处理完信用事件,我的一个JUnit测试检查是否预期最后一行打印到屏幕上。 我发现该行确实按预期打印在屏幕上,但用于存储最后一个打印值的String在测试时为空。

我已确保String引用为volatile,因此我希望事件处理线程的写入对JUnit线程上的读取可见。

机器类包含事件处理循环和以下用于读取和写入String引用的代码:

private volatile String lastPrintln;

public String lastPrintln(){
    return lastPrintln;
}

void println(String s){
   System.out.println(s);
   lastPrintln = s;
} 

测试代码如下......

@Before
public void setUp() throws Exception {
    machine = Objects.create(CoinQuizMachine.class);
    machine.start(); // starts event loop thread
}

private void waitForEventQueueToEmpty(){
    while(!machine.eventQueueIsEmpty()){

    }
}

private void processTestEvent(Event e){
    machine.add(e);
    waitForEventQueueToEmpty();
}

@Test
public void test2() {   
    assertEquals(Demo.class,machine.activeState().getClass());
    processTestEvent(new CreditEvent(1));
    assertEquals("Topic Choices: \nMaths\nScience",machine.lastPrintln());
}

1 个答案:

答案 0 :(得分:0)

是的,我找到了错误,我在实际处理之前减少了未处理事件的值,这意味着测试触发到了早期,有时还没有更新lastPrintln。谢谢你的帮助。