java中的备用同步 - 非同步块

时间:2013-09-03 11:49:54

标签: java multithreading synchronization

我对同步块和多线程有疑问。我有一个“备用”情况,其中应该在非同步块之前和之后执行两个同步块,并且这些块不应该相互干扰。

以下是代码的一部分:

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;
    }       
}

您认为这是最正确的解决方案吗?我真诚地不喜欢这样的方法...... 你有其他解决方案可以提出建议吗?

谢谢

0 个答案:

没有答案