我有一个日志记录线程和一个主应用程序线程。
主应用程序每隔50毫秒运行一次,通常的刻度长度为11毫秒,可以完成它需要做的所有事情。这个11ms或者持续时间长的记录会记录在公共领域主应用程序中的变量中。
在我的日志记录线程中,我想监视跟踪主应用程序线程中平均标记长度的变量,以了解何时应该限制日志记录,因为主应用程序流将始终优先于日志记录。 它是主应用程序中的公共变量,遗憾的是我无法控制主应用程序的设计,也无法使其成为“线程安全”变量。
但是我只想阅读它而不是写信给它。
我是否可以安全地直接读取变量(如果数据在几微秒内不同步或者我在数据上运行并不重要)或者我应该创建一个线程安全的方法来读取变量对我来说并通过反射在主应用程序中注入?
我应该注意哪些可能的问题?什么是最好的方法?
这个问题的目的是了解这个场景中可能出现的所有问题以及我应该注意的问题。我对补丁代码解决方案不感兴趣,但更感兴趣的是学习线程之间的线程和变量的行为以及可能存在的陷阱......
答案 0 :(得分:1)
你不能假设一个线程的变量视图与另一个线程的视图相同。
在一般情况下,系统会缓存变量,但是这个缓存通常会被刷新到核心内存,以便您看到它几乎总是最新的。但是,这是一个危险的假设,因为没有承诺在JVM中实现该功能。
完全有可能尝试从不同的线程中读取值,从不看到它发生变化。
对于跨平台且对Java版本具有弹性的可靠解决方案,您应该找到一种不同的方式来访问该值 - 您对通过反射进行注入的想法可能是可行的。