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

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

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

===============>>#1 票数:5

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

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

重要的是,CompositeCache对象具有用于其写操作(放置删除等)的同步方法,并且在内部实现中使用了Hashtable对象,它们也是线程安全的。 因此,我认为JCS已经在原子级别上关注线程安全。

托马斯上面提到的是正确的。 如果缓存对象已同步,则应该避免并发问题,如上所述似乎不是这种情况,可能是该问题不是真正的并发。

但是,我只想分享一个事实,即不应该通过获取对象级锁来计划使用JCS,因为该实现似乎是线程安全的,我们应该让并发性以更原子的方式进行处理。水平,寻找更好的性能。

===============>>#2 票数:0 已采纳

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

像这样的东西:

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

  ask by Madusudanan translate from so

未解决问题?本站智能推荐:

1回复

JCS Cache关闭,保证磁盘持久性

我使用JCS进行缓存。现在我使用磁盘缓存来临时存储所有数据。问题是当我使用JCS时,只有在缓存正确关闭时才将密钥写入磁盘。 我使用磁盘使用模式作为UPDATE,它告诉JCS立即将数据写入磁盘而不将其保留在内存中。但问题是我们没有保留缓存中对象的密钥列表。所以我使用组缓存访问并获取来自缓存的
1回复

使用JCS时收到错误java.lang.Error:update:last为null

执行放置操作时出现以下错误。 我已经在互联网上搜索了此错误,并检出了论坛,甚至检出了jcs的源代码,但我们没有任何线索。 我们正在使用jcs版本1.2.7.7,任何帮助,指针将不胜感激。
1回复

JCS的样本示例

我是第一次实现JCS。 我的要求:我有一个带有主要方法的java类,在其中我将一些数据存储在缓存中。 我有第二个带有主要方法的Java类,从我使用第一个Java类存储的磁盘缓存中检索该方法。 请注意:1.我想使用磁盘缓存(JCS)。 2.我想从其他JVM检索数据。 3.当我
1回复

覆盖JCS事件

我在我们的应用程序中使用Apache JCS在应用程序启动时缓存常用数据。 但是,如果直到空闲时间才使用缓存中的某些数据,我想从数据库中手动重新加载该值。 因此,基本上,我想重写JCS事件,以使我的Java程序能够知道由于密钥已达到其空闲时间而从缓存中删除密钥的时刻。
1回复

JCS:使用ComplexObject或String作为键

我对.get(key)的工作方式有疑问。 如果我使用复杂的对象作为键,则会发现没有调用equals函数。 但是其中引用了用于标识关键对象的框架。 我需要知道哪个更快? 字符串还是对象作为键?
1回复

有关JCS的信息

这与我之前的问题结合在一起https://stackoverflow.com/questions/8428911/jcs-disk-cache-data-retrieval 即使在应用程序关闭后,JCS还是从磁盘读取数据吗。即,我有一个JCS写入磁盘。事情是一个程序执行写到磁盘的缓存,另一
1回复

JCS无法加载属性

我正在使用JCS进行缓存。 我已经在可以正常运行的PC上实现了此功能,但是在我们的Tomcat服务器以及我的同事PC上,均显示错误“ Failed to load properties for name [/cache.ccf] ”的Failed to load properties for
1回复

如何在Spring Boot中使用JCS(Rest API)

我是Spring Boot缓存的新手,根据我的要求,我想将JCS与spring boot(rest api)一起使用。 我已经在Google上搜索过,但是没有太多信息。 java类有可用的信息。 是否有人知道如何使用它或任何相关的教程或信息。 这可能是基于意见的问题。 但这是非
1回复

如何配置磁盘缓存jcs

我是第一次实现磁盘缓存(jcs)。 我想配置cache.ccf文件以允许磁盘缓存。 我的cache.ccf文件具有以下配置: 我检查了调试,然后看到了以下内容:第一个对象保存在缓存中。 当我保存第二个对象(内存缓存超过其最大大小)时,该对象未保存在磁盘中。 我不知道问题是否出在j
1回复

JCS编辑磁盘辅助缓存DiskPath

我正在使用JCS 1.3缓存开发Web应用程序。 我需要在运行时从JVM属性编辑索引磁盘辅助缓存的DiskPath。 你知道这样做的方法吗? 我设法创建了AuxiliaryCache对象,但我不知道如何将它与cache.ccf中定义的所有区域连接起来。 以下是创建磁盘缓存