Kev*_*ron 1 java concurrency multithreading hashmap
假设我有一个声明如下的HashMap:
@GuardedBy("pendingRequests")
private final Map<UInt32, PendingRequest> pendingRequests = new HashMap<UInt32, PendingRequest>();
对地图的访问是多线程的,并且通过在地图的最终实例上进行同步来保护所有访问,例如:
synchronized (pendingRequests) {
    pendingRequests.put(reqId, request);
}
这够了吗?是否应该使用Collections.synchronizedMap()?创建地图?我应该锁定专用的锁定对象而不是地图实例吗?或者两者都有?
Collections.synchronizedMap()在地图上的多个调用必须是原子的几个区域中需要外部同步(除了可能使用之外).
在地图上进行同步本质上就是Collection.synchronizedMap()返回的Map所做的事情.对于您的情况,这是一种合理的方法,并且建议使用除个人偏好之外的单独锁定对象(或者如果您希望使用更精细的控制并使用ReentrantReadWriteLock来允许并发读取地图).
例如
private Map<Integer,Object> myMap;
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
public void myReadMethod()
{
  rwl.readLock().lock();
  try
  {
    myMap.get(...);
    ...
  } finally
  {
    rwl.readLock().unlock();
  }
}
public void myWriteMethod()
{
  // may want / need to call rwl.readLock().unlock() here,
  // since if you are holding the readLock here already then
  // you cannot get the writeLock (so be careful on how your
  // methods lock/unlock and call each other).
  rwl.writeLock().lock();
  try
  {
    myMap.put(key1,item1);
    myMap.put(key2,item2);
  } finally
  {
    rwl.writeLock().unlock();
  }
}