为什么当一个Java线程开始侦听端口(在127.0.0.1上)而另一个线程连接到该端口时,即使线程充分同步,connect()
调用也需要3秒钟?
即,为什么我的测试程序会产生
的输出Server: accepting...
Client: connecting...
Server: accepted. Millis: 3008
Client: connected. Millis: 3008
大部分时间?
测试是在使用Java 1.6和1.8的Windows 7 PC上运行的,结果相同。我假设,尽管我使用CountDownLatch进行同步,但我遇到bind()
和connect()
之间的竞争条件。在bind()
(在服务器套接字的构造函数中调用)之后,似乎存在一个时间窗口,其中端口尚未真正绑定,因此{{1}遇到错误并重试。
但这只是我的解释。这是代码:
connect()
答案 0 :(得分:-1)
卸载 Check Point VPN 后,此问题完全可靠地消失,这似乎导致了使bind()
异步的副作用。