如何在以下情况下获得多个锁:
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()
内。
答案 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,这更简单。