番石榴的2个系列上的条纹锁

时间:2015-08-17 16:09:05

标签: java multithreading locking guava

由于性能原因,我不想使用synchronized,我需要来自Guava的2个multimaps。 假设我们有一个适用于这两个地图的课程:

directionsDisplay.setDirections(response);

以上两种方法互不阻挡。

我的问题是:如何在以下方法中正确同步其中一个集合?我的锁是条纹,这意味着它内部有一组较小的哈希锁。我可以锁定整套钥匙只是为了阅读吗?还有其他选择吗?

private final Multimap<String, String> rolesByUsers = HashMultimap.create();
private final Multimap<String, String> usersByRoles = HashMultimap.create();

public Collection<String> getAllUsersByRole(String role) {

    Lock lock = stripedLock.get(role).readLock();

    try {
        lock.lock();
        return usersByRoles.get(role);
    } finally {
        lock.unlock();
    }
}

public Collection<String> getAllRolesByUser(String userId) {
    Lock lock = stripedLock.get(userId).readLock();

    try {
        lock.lock();
        return rolesByUsers.get(userId);
    } finally {
        lock.unlock();
    }
}

0 个答案:

没有答案