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

标签 java multithreading

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

相关文章:

Python 多处理 - 线程池数量不乘以池数量

c - 线程未处理任何请求(多线程应用程序中需要帮助)

java - 借鉴其他应用问题 |开关变灰

java - 如何从网络应用程序打印到收据打印机?

c - 使用多个线程分配内存时出现段错误

MySQL - 持久连接与连接池

c - Typedef 结构指针正确指向 typedef 结构 (C)

java - Eclipse java调试: source not found

java - 通过 DI 在 Spring Framework 中正确使用 LOG4J

Java不发送HTTP POST请求