【问题标题】:Modify JVM to serialize file access across threads修改 JVM 以序列化跨线程的文件访问
【发布时间】:2013-10-10 06:31:22
【问题描述】:

我们的应用程序平台是 Java 1.4.2。我们需要在这个版本的JVM(嵌入式系统)上运行某些认证应用程序。

其中一个应用程序正在创建一个线程 T1 来更新文件(通过写入文件)和另一个线程 T2,它应该读取更新的内容(T2 总是在 T1 之后启动)。

问题是写入线程 T1 被延迟,而读取线程 T2 正在读取不正确的数据。线程 T2 不检查文件内容是否已更新。

出于本讨论的目的,可以假设导致延迟的因素是不可修复的。 我们无法更改应用程序,但可以更改 JVM 和原生层接口。

请提出解决方案来序列化对文件的访问而不更改应用程序。 另外,请批评以下方法的可行性: 在 JVM 中创建一个前瞻线程,它可以分析 java 字节码并序列化跨同一应用程序的多个线程对文件的访问。

【问题讨论】:

  • 这听起来像是经典的生产者消费者问题。
  • 您可以更改应用程序,但您可以更改 JVM,抱歉这没有意义,因为 JVM 可以更改应用程序。您的应用程序中存在错误,再多假装您没有解决问题。如果您可以更改 JVM,请考虑使用 Java 7 作为 Java 1.4.2,Java 5.0 和 Java 6 都将结束生命。
  • 同意@Manish,但是如果你只有两个线程,一个用于写作,一个用于阅读。为什么不使用线程连接来确保 T2 连接到 T1。
  • 我认为反编译修改它并重新编译它的程序会更好。而不是尝试某种字节码操作。

标签: java multithreading jvm


【解决方案1】:

请评价以下方法的可行性:在 JVM 中创建一个前瞻线程,该线程可以分析 java 字节码并序列化跨同一应用程序的多个线程对文件的访问。

就本次讨论而言,100% 不可行。如果你不能做一些简单的事情,比如升级一个有十年历史的 JVM 并为应用程序添加一点同步,那么你将无可救药地超出你的深度 (a) 修改 JVM (b) 向应用程序添加线程(我以为你说你不能修改它?)和 (c) 摆弄字节码,以及 (d) 维护由此产生的混乱。下一个人是否会被限制使用相同的“修改”1.4.2 JVM/添加的线程/生成的字节码?这在哪里停止?

相反,您应该寻求真正解决问题。其线程通过文件系统相互通信的应用程序被严重错误设计。不要让事情变得更糟。

【讨论】:

  • 要使用的java版本是一个约束,我在原帖中已经注意到系统是嵌入式系统。我的意思是向 JVM 添加一个线程,该线程可以对要由其他一些线程执行的代码进行预测和分析。该应用程序是标准合规性测试光盘的一部分,几乎没有机会对其进行修改。我想我会尝试解决延迟问题,尽管它之前已经使用 hack 进行了修复,但显然并没有完全解决问题。感谢您的 cmets。
  • 我看不出这有什么改变。你有一个十年前的系统,听起来像是一个十年前的错误。添加 1000 根拐杖不会有任何改善。如果您可以更改 JVM,则可以对其进行更新,而您别无选择,只能同时修复应用程序。
  • 如果认证申请有bug,那么努力通过有什么意义?向发布它的当局投诉,他们必须修复它。如果您更改 JVM,几乎可以肯定您会通过其他测试。
猜你喜欢
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多