我有一个关于同步块和多线程的问题。我有一个“替代”情况,其中两个同步块应该在一个非同步块之前和之后执行,并且这些块不应该相互干扰。
这是(部分)代码:
boolean calculate = false;
synchronized(this){
Double oldSim = struct.get(pair);
if(oldSim == null || oldSim < maxThreshold)
calculate = true;
}
if(calculate)
{
// This part should be parallel
Double newSim = calculateSimilarity(...);
synchronized(this){
if(newSim > minThreshold && (oldSim == null || newSim > oldSim))
struct.put(pair, newSim);
}
}
问题是,通过这种方式,不同的线程可以执行第一个同步块,而另一个线程可以执行第二个同步块。所以,我虽然这个解决方案:
int maxThreshold = 1.0;
if(checkAndwriteSimilarity(pair, null, false))
{
Double newSim = calculateSimilarity(table, pKey1, pKey2, pKey1Val, pKey2Val, c);
checkAndwriteSimilarity(pair, newSim, true);
}
private synchronized boolean checkAndwriteSimilarity(Pair pair, Double newSim, boolean write)
{
Double oldSim = struct.get(pair);
if(!write)
{
if(oldSim == null || oldSim < maxThreshold)
return true;
else
return false;
}
else
{
if(newSim > minThreshold && (oldSim == null || newSim > oldSim))
struct.put(pair, newSim);
return true;
}
}
您认为这是最正确的解决方案吗?我真的很不喜欢这种方法......你有其他解决方案可以建议吗?
谢谢