我有一个运行的线程,不断更新我的laskAck变量。我将我的超时设置为非常大,以便我的线程有机会更新laskAck变量。当我调试我的代码并逐步运行时,它可以工作,但如果我正常运行,程序会暂停if(timePassed> timeOut)。知道为什么会这样吗???
long timeout = 40000000;
while (lastAck != sent) {
currentTime = System.currentTimeMillis();
packetSentTime = send_timer[(sent - 1) % cwnd];
timePassed = currentTime - packetSentTime;
if (timePassed > timeOut) {
ssthresh = (int) (Math.ceil(cwnd / 2));
cwnd = 1;
sent = lastAck;
System.out.println("Time out occured\n" + lastAck);
timeout = true;
break;
}
}
答案 0 :(得分:1)
由于存在由另一个线程更新的变量,因此必须以支持线程安全的方式声明该变量。一种方法是使用volatile
关键字。其他方法可能包括使用java.util.concurrent
包中的类型。
在此处的特定情况下,请确保将变量lastAck
声明为:
volatile long lastAck;
并且循环检查将始终从内存中提取值而不是缓存它。
答案 1 :(得分:0)
Java区分大小写,因此timeout
与timeOut
不同。您需要将条件更改为timePassed > timeout
。