gpt4 book ai didi

java - JCS 并发错误

转载 作者:行者123 更新时间:2023-11-29 08:10:23 26 4
gpt4 key购买 nike

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

这更像是一个生产者-消费者问题,不同之处在于我的消费者线程不消费数据,而只是读取数据。所以同步确实保证只有一个线程写入缓存,但这并不能解决我的问题,因为另一个线程访问不同键的对象。

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

最佳答案

最近我开始使用 JCS,但遇到了“JCS 线程安全吗?”的问题。嗯,我看了下源码,发现实现上已经考虑了线程安全。

JCS.getInstance(String region) 确实总是为每个区域键返回相同的 CompositeCache 对象,包装在一个新的 JCS 对象中。换句话说,唯一的 CompositeCache 对象的引用保存在新创建的包装器 JCS 对象中。当我们调用 JCS.get()、JCS.put()、JCS.remove() 等方法时,它总是会以调用唯一的 CompositeCache 对象的方法而告终。所以,它是单例的。

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

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

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

关于java - JCS 并发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8474572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com