JCS并发错误

Mad*_*nan 1 java concurrency jcs

我在我的应用程序中使用JCS进行缓存.最近发生了一些错误,其中对缓存中的数据的并发访问导致空值,即一个线程写入缓存并且一个线程读取缓存.我想知道JCS是否本身支持从缓存中写入和读取时的线程安全实现.我也想知道如何使我的实现线程安全.因为我有多个类写入缓存,说PutData实现Runnable用于写入缓存和GetData也实现Runnable从缓存中读取,所以使方法synchronized没有任何意义,并且使它们原子也没有意义,因为数据不在类之间共享,我将数据对象传递给各个类.BTW我使用的是POJO序列化类.无论如何要克服这一点,或者我是否必须以强有力地完成写作然后阅读的方式改变我的实现,这是我认为的愚蠢.

这更像是生产者 - 消费者问题,除了我的消费者线程不消耗数据,而只是读取数据.因此同步确保只有一个线程写入缓存,但这并不能解决我的问题,因为另一个线程访问不同密钥的对象.

期待你的回答,谢谢,Madhu.

Tha*_*ana 5

最近我开始使用JCS,我遇到了"JCS线程安全吗?"的问题.好吧,我看了一下源代码,发现实现已经考虑了线程安全性.

JCS.getInstance(String region)总是为每个区域键返回相同的CompositeCache对象,包装在一个新的JCS对象中.换句话说,只有一个CompositeCache对象的引用保存在新创建的包装器JCS对象中.当我们调用JCS.get(),JCS.put(),JCS.remove()等方法时,它总是最终调用一个只有CompositeCache对象的方法.所以,它是单身人士.

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

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

但是,我只是想分享这样一个事实,即不应该计划通过获得如上所述的对象级锁来使用JCS,因为实现似乎是线程安全的,我们应该让并发处理更加原子化水平,寻找更好的表现.