如何在保持线程安全的同时减少锁定的粒度?

时间:2016-12-04 04:32:08

标签: java multithreading

我有一个简单的托管堆栈,需要以线程安全的方式访问。我的第一个实现正常工作,但使用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的并发实现?

0 个答案:

没有答案