Java 定期刷新大型对象

Java 定期刷新大型对象,java,multithreading,service,synchronization,Java,Multithreading,Service,Synchronization,我们使用面向服务的体系结构,并且有一个多线程应用程序来服务请求。这些请求需要从一个大型对象中读取某些值,该对象在所有线程中共享,并且必须通过从数据库中读取该对象来定期刷新(例如,频率为每天一次) 这个大对象的定期刷新可能需要几分钟的时间,我们的服务仍然必须使用对象的旧缓存值继续为请求提供服务。换句话说,在获得对象的最新值之前,我们不希望阻止请求 我们正在考虑做以下工作: 守护进程线程可以读取数据库并将对象重构为新变量。稍后,可以将新对象的引用复制到保存以前缓存的对象的变量上。但是,我们不确定引用

我们使用面向服务的体系结构,并且有一个多线程应用程序来服务请求。这些请求需要从一个大型对象中读取某些值,该对象在所有线程中共享,并且必须通过从数据库中读取该对象来定期刷新(例如,频率为每天一次)

这个大对象的定期刷新可能需要几分钟的时间,我们的服务仍然必须使用对象的旧缓存值继续为请求提供服务。换句话说,在获得对象的最新值之前,我们不希望阻止请求

我们正在考虑做以下工作:

守护进程线程可以读取数据库并将对象重构为新变量。稍后,可以将新对象的引用复制到保存以前缓存的对象的变量上。但是,我们不确定引用的复制是否可以说是合理的线程安全操作(我们不需要它是完全线程安全的)

换句话说,如果守护进程线程按如下方式更新共享变量a(不锁定它):

A=B

此时,如果另一个线程试图读取A,它是否总是只读取A的新值或旧值(这两种情况对我们来说都是可以接受的),或者它是否可能最终读取一些垃圾值?如果我们明确需要锁定,那么请求的延迟可能会增加

欢迎提出任何其他建议


谢谢

在Java中,赋值是原子的

问题是线程可以缓存非易失性变量,因此看不到更新。这是一个可见性问题。在最坏的情况下,另一个线程可能不会看到更新的值

您应该将变量标记为volatile,以确保在重新分配变量时,所有线程都能看到它。这确实有一些成本,但这是必需的


解释了在内存访问方面使用
volatile
的含义。

谢谢Boris。那有帮助!