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

并且循环检查将始终从内存中拉出该值,而不是将其缓存。

10-08 01:20