【发布时间】:2018-01-31 17:28:51
【问题描述】:
我创建了一个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。我不知道为什么。
【问题讨论】:
-
不确定这些
synchronized (LockForEhcache)是关于什么的...但是 ehcache 不需要您同步访问,使用它是完全线程安全的...如果另一方面,您试图同步这些线程,以便线程 1 在 t2 和 t3 到达get之前放置,这不会按原样工作。还是只是说你做了什么? -
我正在使用锁,因此除非线程 1 完成其 put ,否则其他线程不会尝试 get 。为什么这不起作用?
-
好吧,也许我在这里“猜测”太多了...... t1 是主线程,而 t2 和 t3 是从中分离出来的吗?如果不是,并且所有三个线程都在竞相获取锁,那么这可能工作,但不确定(即你不能保证 t1 首先获取锁并安装映射)。如果 t1 产生另外两个线程,它仍然需要在安装映射之后 这样做。锁只提供排除,不提供排序。
标签: java concurrency ehcache ehcache-bigmemory ehcache-3