首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中并发缓存的修改

Java中并发缓存的修改
EN

Stack Overflow用户
提问于 2013-10-17 09:37:08
回答 2查看 290关注 0票数 0

我正在构建一个带有Map的小缓存,它包含一些DB查询的缓存结果。假设此缓存是以线程安全的方式填充的。我的问题是关于这个缓存中的条目,类型为结果的对象。

考虑以下情况:

线程1从缓存中读取并获取一些结果对象,称为R. Thread 2希望杀死相同的对象R,因此它调用缓存杀死对象R。

考虑到两个线程如何只保存对对象R的引用,有可能对象R突然成为线程1的空,因为线程2已经调用来杀死它。

我怎么才能避免这种情况?当线程从缓存中读取时,我是否应该对对象R进行深度复制,以便即使线程2杀死了缓存,那么线程1仍然能够在没有问题的情况下完成它正在做的事情?还是有别的办法来解决这个问题?我在线程和并发方面的经验并不是最大的,所以请温和.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-17 09:49:12

是的--通常你把结果当作一个值对象。线程2将从缓存中删除它,或者用更新的值覆盖缓存,但通常不会损坏/破坏R的内部状态。

线程2“将null放入缓存”或“将新值放入缓存”本身不会影响使用R的任何其他引用或线程,除非您明确地破坏它,否则R中的任何内容都不会中断。从缓存中请求对象的代码将不再被赋予对R的特定引用。

指针/或引用将更改或设置为null,而R本身的state &字段不会。

这假设R不保存需要释放的资源。

如果R确实需要保存资源,这不是通常的情况,那么您可能需要添加一个正在使用的计数器,并通过在缓存中保存并被客户端代码使用来计算两种正在使用的资源,这样R的资源只有在计数器减少到零时才会释放。

但这将是一个不同寻常的要求。

票数 2
EN

Stack Overflow用户

发布于 2013-10-17 09:54:58

如果您的“杀死”操作修改了结果的内部,那么您可能会遇到这个问题。如果没有,则对已经从缓存接收到它的线程的引用不能变为null。从映射中删除对象不会使引用为空。

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

https://stackoverflow.com/questions/19423093

复制
相关文章

相似问题

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