相关疑难解决方法(0)

ConcurrentHashMap和Collections.synchronizedMap(Map)有什么区别?

我有一个Map,它将被多个线程同时修改.

Java API中似乎有三种不同的同步Map实现:

  • Hashtable
  • Collections.synchronizedMap(Map)
  • ConcurrentHashMap

据我所知,这Hashtable是一个旧的实现(扩展过时的Dictionary类),后来经过调整以适应Map界面.虽然它同步的,但似乎存在严重的可扩展性问题,并且不鼓励新项目.

但是其他两个怎么样?返回的地图Collections.synchronizedMap(Map)ConcurrentHashMaps 之间有什么区别?哪一种适合哪种情况?

java concurrency dictionary

577
推荐指数
13
解决办法
33万
查看次数

同步整数值

可能重复:
增加java中锁的数量的最佳方法是什么

假设我想基于整数id值进行锁定.在这种情况下,有一个函数可以从缓存中提取值,并且如果值不存在则执行相当昂贵的检索/存储到缓存中.

现有代码未同步,可能会触发多个检索/存储操作:

//psuedocode
public Page getPage (Integer id){
   Page p = cache.get(id);
   if (p==null)
   {
      p=getFromDataBase(id);
      cache.store(p);
   }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是同步id上的检索,例如

   if (p==null)
   {
       synchronized (id)
       {
        ..retrieve, store
       }
   }
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,因为2个单独的调用可以具有相同的Integer id值但是具有不同的Integer对象,因此它们不会共享锁,并且不会发生同步.

有没有一种简单的方法可以确保您拥有相同的Integer实例?例如,这会工作:

 syncrhonized (Integer.valueOf(id.intValue())){
Run Code Online (Sandbox Code Playgroud)

Integer.valueOf()的javadoc似乎意味着您可能会获得相同的实例,但这看起来不像是一个保证:

返回表示指定int值的Integer实例.如果不需要新的Integer实例,通常应优先使用此方法,而不是构造函数Integer(int),因为此方法可能通过缓存频繁请求的值来显着提高空间和时间性能.

那么,关于如何获得保证相同的Integer实例的任何建议,除了更精细的解决方案,比如保持Lock对象的WeakHashMap键入int?(没错,看起来似乎必须有一个明显的单行而不是我错过了).

java synchronization

32
推荐指数
2
解决办法
4万
查看次数

标签 统计

java ×2

concurrency ×1

dictionary ×1

synchronization ×1