首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JCS并发错误

JCS并发错误
EN

Stack Overflow用户
提问于 2011-12-12 12:50:59
回答 2查看 1.6K关注 0票数 1

在我的application.Recently中,我使用JCS缓存一些错误,并发访问缓存中的数据会导致null值,即一个线程写入缓存,一个线程读取缓存,我想知道JCS在写和读取缓存时是否本质上支持线程安全实现。我还想知道如何使我的实现线程safe.Because --我有多个类在写缓存--假设实现Runnable的PutData用于写缓存,GetData也实现Runnable用于从缓存读取,因此使方法同步没有任何意义,也使它们原子化也是没有意义的,因为数据不是在类之间共享的,我使用POJO序列化类将数据对象传递给单独的classes.BTW。不管怎么说,是要克服这个问题,还是我必须改变我的实现方式,让它有力地完成写作和阅读,我认为这是愚蠢的。

这更像是一个生产者-消费者问题,除了事实上我的消费者线程不是消费数据,而是读取数据。因此,同步确实保证只有一个线程写入缓存,但这不能解决我的问题,因为其他线程访问不同键的对象。

等着你的回答,谢谢你,马杜。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-12 12:54:33

我不知道JCS,但是您可以在对象上同步,所以您可能希望在缓存对象上同步。

像这样的事:

代码语言:javascript
复制
public void putToCache(...) { 
  synchronized (cache) { //cache is your actual cache instance here
   //put to cache here
  }
} 
票数 0
EN

Stack Overflow用户

发布于 2013-12-10 17:00:15

最近我开始使用JCS,我遇到了“JCS线程安全吗?”这个问题。嗯,我看了一下源代码,发现实现考虑了线程安全。

JCS.getInstance(String )总是在每个区域键中返回相同的CompositeCache对象,包装在一个新的JCS object.In中--换句话说,只有一个CompositeCache对象的引用保存在新创建的包装器JCS对象中。当我们调用方法(如JCS.get()、JCS.put()、JCS.remove()等)时,它总是以调用惟一的CompositeCache对象的方法而告终。所以,这是单身。

重要的是,CompositeCache对象为其写操作(put、remove等)提供了同步方法。并且在内部实现中使用了Hashtable对象,这些对象也是线程安全的。所以我认为JCS已经在原子级别上处理了线程安全问题。

托马斯上面提到的是真的。如果缓存对象是同步的,那么应该避免并发问题,这似乎不像上面提到的那样,可能是其他问题,而不是真正的并发。

但是,我只想分享这样一个事实:我们不应该像上面讨论的那样通过获取对象级别的锁来使用JCS,因为实现似乎是线程安全的,我们应该让并发在更原子的级别上处理,以寻求更好的性能。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8474572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档