我试图在我的代码中防止竞争条件,在一个代码块中,if语句用方法检查条件(变量是否为null),在代码块的末尾(在一些主要操作之后),该变量发生了变化,它不再是null了。
如果两个线程同时运行该块,其中一个线程完成块后,另一个线程因为ID/值已经被第一个线程写入(存在)到数据映射而异常。第二个线程需要等待第一个线程完成它的工作。在等待之后,变量不再是NULL,第二个线程将不会运行代码块,不会得到异常。
示例代码(JAVA):
SOTable testtable= SOTable.getInstance();
if (testtable.findvalue(ID) == null){
// A lot of if statements here...
// At the last of the code block:
testtable.insert(ID,data);
// testtable.findvalue(ID) not equal NULL any more
}
// findvalue method
public SOData findvalue(String ID) {
SOData testdata = null;
synchronized (lock) {
testdata = (SOData)dataMap.getValue(ID);
}
return testdata; // If ID not match returns NULL
}
你认为使用"synchronized (lock)"这里可以防止这种情况?
感谢synchronized
将有助于控制单个进程中多个线程的访问。
然而,拍打synchronized
并不总是正确的,如果不正确,可能会导致更多的问题。因为看起来你是在处理一个外部持久化层(一个表),有可能是一个不同的进程(无论是在同一台机器上还是在不同的机器上)正在进行更新-synchronized
不会帮助。
你需要进一步调试&在确定使用synchronized
是否是正确的解决方案之前,确定问题的根本原因——是什么导致了竞争性的修改。