2011-12-12 14 views
1

我正在使用JCS在我的应用程序中进行缓存。最近出现了一些错误,其中并发访问高速缓存中的数据导致空值即ie一个线程写入缓存,一个线程读取缓存。我想知道当从缓存写入和读取时,JCS是否支持线程安全实现。 我也想知道如何让我的实现线程安全。因为我有多个类写入缓存,比如PutData实现Runnable用于写入缓存,GetData也实现Runnable用于从缓存中读取,因此使得同步的方法没有意义,并且使它们成为原子也是没有意义的,因为数据不是在类之间共享的,而是将数据对象传递给各个类.BTW我正在使用POJO串行化类。 有没有办法克服这个问题,还是我必须改变我的实现方式,以便强制完成写作然后阅读,这是愚蠢的我认为。JCS并发错误

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

期待你的回答, 谢谢, 马杜。

回答

0

我不知道JCS,但可以在对象上进行同步,因此您可能希望在缓存对象上进行同步。

成才这样的:

public void putToCache(...) { 
    synchronized (cache) { //cache is your actual cache instance here 
    //put to cache here 
    } 
} 
+0

@MadhuSudhan所以你没有把同步块_into_的方法和同步在_same_缓存实例? – Thomas

+0

我已经试过了,因为我使用的是runnable接口,所以我尝试了public void run()方法,但它没有任何效果。我也对调用方法使用了synchronized,仍然没有效果。是否有任何接口我可以在servlet中实现诸如SingleThreadModel。 – Madusudanan

+0

@MadhuSudhan看到我编辑的答案。你不同步方法本身,但添加一个'synchronized'块_inside_方法并在_cache instance_上同步,而不是在任何非共享对象上。 – Thomas

4

最近我开始使用JCS和我有问题 “JCS线程安全吗?”。 那么我看看源代码,发现实现已经考虑了线程安全性。

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

重要的是,CompositeCache对象为其写入操作(放入删除等)具有同步方法,并在内部实现中使用了Hashtable对象,这些对象也是线程安全的。所以我认为JCS已经在原子级考虑了线程安全。

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

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