我有一个日志线程和一个主应用线程。
主应用程序每50ms运行一次,通常的滴答长度为11ms,可以完成它需要做的所有事情。这个11ms或无论滴答持续多久,都会记录在公共字段的主应用程序中的一个变量中。
在我的日志线程中,我想监控一个变量,该变量跟踪主应用线程中的平均计时长度,以便知道何时应该限制日志,因为主应用流始终具有高于日志的优先级。它是主应用程序中的一个公共变量,不幸的是,我无法控制主应用程序的设计,也不能使其成为“线程安全”变量。
然而,我只想读它,而不想写它。
我是否可以安全地直接读取变量(如果数据在几微秒内不同步或我在数据上运行缓慢,这并不重要),或者我是否应该创建一个线程安全的方法,为我读取变量并通过反射将其注入到主应用程序中?
我应该注意哪些可能的问题?最好的方法是什么?
这个问题的目的是了解在这个场景中可能出现的所有问题,以及我应该注意的问题。我对补丁代码解决方案不感兴趣,但更感兴趣的是了解线程的行为和线程之间的变量,以及可能存在的陷阱。
发布于 2015-07-01 16:35:59
您不能假设一个线程的变量视图与另一个线程的视图相同。
在一般情况下,系统将缓存变量,但此缓存将经常刷新到核心内存,以便您可以看到它几乎总是最新的。然而,这是一个危险的假设,因为没有承诺在JVM中实现该功能。
尝试从不同的线程读取值是完全有可能的,而永远不会看到它的变化。
对于跨平台和Java版本弹性的可靠解决方案,您应该找到一种不同的方式来获取价值-您关于通过反射进行注入的想法可能是可行的。
https://stackoverflow.com/questions/31155908
复制相似问题