我正在使用类似于以下的方法来同步对地图的访问。
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) {}
所做但无法找到正确引用的参考。有人能指出我指定功能的参考吗?
答案 0 :(得分:3)
当另一个线程在
Foo.get()
中执行map.put()
时,是否会阻止正在调用Foo.add()
的线程访问地图?
如果另一个线程仍在synchronized(map)
块内,它将阻止遇到synchronized(map)
块的任何线程。您的map
就像一个信号量。
如果您想要同步对地图的访问权限,请使用Collections.synchronizedMap
方法,或使用ConcurrentHasMap
实施。
如果您对锁定java感兴趣,请查看Lock Objects。
通常,最佳做法是使用private final
Object
实例作为信号量。这可以避免常见错误,例如,如果您以任何方式返回地图或者向地图提供设置器,则会丢失独占访问锁定对象。它也更清晰。