gpt4 book ai didi

java - 我使用计时器无缘无故地陷入了 for 循环

转载 作者:行者123 更新时间:2023-12-01 10:08:47 26 4
gpt4 key购买 nike

我有一个正在运行的线程不断更新我的 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 长lastAck;

并且循环检查将始终从内存中提取值而不是缓存它。

关于java - 我使用计时器无缘无故地陷入了 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36298906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com