我有一个简单的托管堆栈,需要以线程安全的方式访问。我的第一个实现正常工作,但使用synchronized
方法进行所有访问,即。锁定处于最粗糙的水平。我想尽可能地锁定,但我不确定最好的方法。
以下是我的Stack管理器类的基础知识(为简洁起见,省略了一些细节):
public class StackManager {
private final Map<String, Deque<String>> myStacks;
public StackManager() {
myStacks = new ConcurrentHashMap<String, Deque<String>>();
}
public synchronized void addStack(String name) {
if (myStacks.containsKey(name)) {
throw new IllegalArgumentException();
}
myStacks.put(name, new ConcurrentLinkedDeque<String>());
}
public synchronized void removeStack(String name) {
if (!myStacks.containsKey(name)) {
throw new IllegalArgumentException();
}
myStacks.remove(name);
}
public synchronized void push(String stack, String payload) {
if (!myStacks.containsKey(stack)) {
throw new IllegalArgumentException();
}
myStacks.get(stack).push(payload);
}
public synchronized String pop(String stack) {
if (!myStacks.containsKey(stack)) {
throw new IllegalArgumentException();
}
return myStacks.get(stack).pop();
}
}
经常不使用堆栈级方法(addStack(),removeStack())。但是我想知道他们的锁定水平是否可以降低。例如,如果这些方法不同步并在myStacks
上建立锁定会减少争用吗?例如,
public void addStack(String name) {
synchronized(myStacks) {
if (myStacks.containsKey(name)) {
throw new IllegalArgumentException();
}
myStacks.put(name, new ConcurrentLinkedDeque<String>());
}
}
per-stack方法(push(),pop())是我觉得可以获得最大收益的地方。如果可以的话,我想实现每栈锁定。也就是说,只锁定正在操作的堆栈管理器中的单个堆栈。但是我看不出这样做的好方法。有什么建议吗?
虽然我们在这里,是否有必要使用Map和Deque的并发实现?