在Java中同步对映射的访问

时间:2014-11-15 07:08:06

标签: java multithreading synchronization thread-safety

我正在使用类似于以下的方法来同步对地图的访问。

public class Foo {
    private Map<String, String> map = new HashMap<String, String>();

    public void add(String key, String value) {
        synchronized (map) {
            map.put(key, value);
        }
    }

    public String get(String key) {
        synchronized (map) {
            return map.get(key);
        }
    }
}

当另一个线程在Foo.get()中执行map.put()时,这会阻止调用Foo.add()的线程访问地图吗?

我对Java很新,并搜索了对synchronized(object) {}所做但无法找到正确引用的参考。有人能指出我指定功能的参考吗?

1 个答案:

答案 0 :(得分:3)

  

当另一个线程在Foo.get()中执行map.put()时,是否会阻止正在调用Foo.add()的线程访问地图?

如果另一个线程仍在synchronized(map)块内,它将阻止遇到synchronized(map)块的任何线程。您的map就像一个信号量。

如果您想要同步对地图的访问权限,请使用Collections.synchronizedMap方法,或使用ConcurrentHasMap实施。

如果您对锁定java感兴趣,请查看Lock Objects。

通常,最佳做法是使用private final Object实例作为信号量。这可以避免常见错误,例如,如果您以任何方式返回地图或者向地图提供设置器,则会丢失独占访问锁定对象。它也更清晰。