我有一个正在运行的线程,该线程不断更新我的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;
}
}
最佳答案
由于存在另一个线程正在更新的变量,因此必须以支持线程安全的方式声明该变量。一种方法是使用volatile
关键字。其他方法可能包括使用java.util.concurrent
包中的类型。
在这里的特殊情况下,请确保变量lastAck
声明为:volatile long lastAck;
并且循环检查将始终从内存中拉出该值,而不是将其缓存。