java - 为什么我不能打破 Java 循环

标签 java multithreading

即使我使用了synchronized,我也无法到达代码的最后一行。 但是,如果我在循环之间添加一些东西,效果会很好。

public static void main(String[] args) {
    int test_time = 5;
    for (int i = 0; i < 100000; i++) {
        //warm up
    }
    long t = 0;
    t = System.currentTimeMillis();
    byte[] b = new byte[0];
    for (int i = 0; i < test_time; i++) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                String i = getUserInf(); //get something from web
                synchronized (b) {
                    ++times;
                    System.out.println(times);
                }
            }
        }).start();
    }

    while (times != test_time){
        // System.out.println(String.format("times=%s,test_time=%s", times,test_time));     
        // if i added this line, it worked well
    }
    System.out.println("time:" + (System.currentTimeMillis() - t));
}

最佳答案

您需要将变量times 声明为volatile int。因为当它从主线程在while循环中读取时,它不受b的保护。对 System.out.println 的调用是同步的,因此 times 的值得到更新并变得可见。

关于java - 为什么我不能打破 Java 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28984644/

相关文章:

java - 将 JSON 数据映射到 Java 对象时遇到问题

java - 从tomcat5.5迁移到tomcat7时出现以下jsp错误

java - 线程限制/swingworkers

multithreading - 使用内存sqlite数据库时,QSqlQuery是否有线程锁

windows - 运行线程时窗口偶尔会挂起/卡住

java - 练习实现堆栈,需要帮助理解奇怪的行为

Java:使用 URLDecoder 但保留加号 (+)

java - 从外部方法访问变量

java - 在 Web 应用程序中调用 ExecutorService.shutdown() 的位置

excel - 使用 Application.OnTime 的调度和重复出现问题