Java:获取多个锁

时间:2014-07-13 12:10:09

标签: java concurrency locking synchronized

如何在以下情况下获得多个锁:

public class DoubleCounter
{
    private int valA = 0;
    private int valB = 0;

    private Object lockA = new Object();
    private Object lockB = new Object();

    public void incrementA()
    {
        synchronized (lockA)
        {
            valA++;
        }
    }

    public void incrementB()
    {
        synchronized (lockB)
        {
            valB++;
        }
    }

    public void print()
    {
        //I have to obtain both lockA & lockB before executing this:
        System.out.format("valA: %d\nvalB: %d", valA, valB);
    }
}

请记住,我不希望一个线程执行incrementA()来阻止另一个线程执行incrementB() - 因此我不想使用同步方法。

类似(不完全相同)问题已在StackOverflow上被问过两次,但我仍然没有得到我想要的答案。我唯一知道的是我不应该将synchronized()嵌套在另一个synchornized()内。

1 个答案:

答案 0 :(得分:0)

考虑

的选项
public void print()
{
    final int localA;
    synchronized(lockA)
    {
        localA = valA;
    }

    final int localB;
    synchronized(lockB)
    {
        localB = valB;
    }

    //I have to obtain both lockA & lockB before executing this:
    System.out.format("valA: %d\nvalB: %d", localA, localB);
}

另一种选择是简单地使用AtomicInteger,这更简单。