![]() |
1
1
这听起来像是一种竞争条件,即有缺陷或缺少同步。由于竞争条件取决于时间,所以几乎任何事情(包括切换JVM)都会导致它们出现。 我不再担心64位和32位的问题,尝试诊断实际的问题。因为它涉及多台机器,不幸的是它将非常困难(这通常是与比赛条件)。 最好的方法可能是确保所有机器都使用NTP同步时钟,然后用毫秒时间戳记录消息的发送、接收和处理,以便您可以看到消息丢失或处理不当的地方。 |
![]() |
2
1
我们发现了问题所在。在一个部分有一个循环,在这个循环中,一个线程等待另一个线程正在处理的某个东西准备就绪,但它只是一段时间(!准备好了){}循环。在64位的JVM线程中似乎不会被抢占,因为在32位的JVM中,这个循环会被抢占,然后另一个线程会完成并将变量设置为true,但在64位的JVM中不会。我现在明白了,我们应该使用wait/notify和locks来完成这项工作,但至少暂时在其中抛出sleep()来修复它。不完全是一种竞争条件,更像是线程模型的一个怪癖,所以我不接受其他任何答案,因为它们没有回答我提出的问题。 |
![]() |
3
0
使用Java -64选项运行Java进程吗?如果没有,那么我很确定您仍然在32位模式下运行JVM,并且您的问题可能与环境或操作系统有关,而不是与位有关。 |
![]() |
4
0
我不希望64对32会导致任何问题,在这种情况下,线程更可能是您的原因。 使用原始套接字的荣誉,但它们很难得到正确的答案。考虑为您的网络堆栈使用一个库,比如 Apache Mina 当然,除非项目的目标是编写自己的套接字代码。肯定读过了 quick start guide . 它是基于文本的协议,直接映射到您正在使用的内容。 旁注:在每个方法上都保持同步,并且使用Finalize是坏东西/代码气味的症状 |