多个线程可以使用相同CacheManager的相同Ehcache对象吗?

时间:2017-08-23 08:22:03

标签: java concurrency ehcache ehcache-bigmemory ehcache-3

我创建了一个Cache对象,它以String为键,序列化对象为值。

Cache(String--->Object) 

我正在尝试运行三个Akka线程,它们以同步方式检索并写入同一个Ehcache对象。

Thread 1- synchronized (LockForEhcache){ 
              serializedObj = cachename.get("key"); //--- this returns an Object            
          }
          //modify the serializedObj here....
          //Again store the modify Object in the Cache
          synchronized (LockForEhcache){
              cachename.clear();
              cachename.put("key",serializedObj);
Thread 2- synchronized (LockForEhcache){ 
              serializedObj = cachename.get("key"); //--- this returns null
          }
Thread 3- synchronized (LockForEhcache){ 
              serializedObj = cachename.get("key"); //--- this returns null
          }

但只有一个线程获得存储在Cache中的值。对于其余的线程,它会抛出NullPointerException。我无法弄清楚原因。

2 个答案:

答案 0 :(得分:2)

首先,缓存不是商店。因此,您无法期望缓存始终返回最新数据。由于不同的原因,它可能会返回null。

现在,除非发生一些驱逐或过期,否则数据应该在那里。所以我需要一个完整的例子来告诉你发生了什么。

我的第一个问题是:为什么要清楚并放?为什么不放?我们是否同意清除所有条目?您的缓存中只有一个条目?

答案 1 :(得分:1)

我现在只看到第一个线程也以get开头,这是否意味着映射已安装总是?如果是这样,您确定其他线程实际上使用的是同一个Cache实例吗?