当前位置: 首页 > 知识库问答 >
问题:

JIT是这种行为的原因吗?

赵超
2023-03-14

在这个问题的启发下,我写出了测试题:

public class Main {

    private static final long TEST_NUMBERS = 5L;

    private static final long ITERATION_NUMBER = 100000L;

    private static long value;

    public static void main(final String [] args) throws Throwable {
        for(int i=0; i<TEST_NUMBERS; i++) {
            value = 0;
            final Thread incrementor = new Thread(new Incrementor());
            final Thread checker = new Thread(new Checker());
            incrementer.start();
            checker.start();
            checker.join();
            incrementer.join();
        }
    }

    static class Incrementor implements Runnable {
        public void run() {
            for(int i=0; i<ITERATION_NUMBER; i++){
                ++value;
            }
        }
    }

    static class Checker implements Runnable {
        public void run() {
            long nonEqualsCount = 0;
            for(int i=0; i<ITERATION_NUMBER; i++){
                if(value != value) {
                    ++nonEqualsCount;
                }
            }
            System.out.println("nonEqualsCount = " + nonEqualsCount);
        }
    }
}

本程序以普通大小写形式打印:

nonEqualsCount = 12; //or other non 0 value;
nonEqualsCount = 0;
nonEqualsCount = 0;
nonEqualsCount = 0;
nonEqualsCount = 0;

首先:我解释这种行为是JIT编译器的存在。“预热”后,每个线程的JIT编译器缓存值非volatile字段。对吧?

第二:如果先对或不对,我如何验证这一点?

附注。-我知道打印-选项。

更新:enviroment:Windows 7 64bit,JDK 1.7.0_40-b43(热点)。

共有1个答案

屈浩波
2023-03-14

您看到的可能是JIT的工件。在它开始执行之前,对Java字节代码进行解释,这意味着在比较过程中checker线程很有可能被中断。

此外,由于执行的代码更多,需要刷新CPU缓存的几率更高。

当代码被JIT优化时,它可能会插入64位的操作,而且由于只执行少量代码,缓存将不再被刷新到主内存中,这意味着线程没有机会看到另一个线程所做的更改。

 类似资料:
  • 我对编程很陌生,我已经自学了将近一个月了,有谁能给我解释一下我代码中错误的原因吗?在“Total(moneyConv(moneySum*moneyRate))”中出错。行,表示实际和形式的论点在长度上是不同的。我检查了我所有的参数,我觉得很好。多谢!

  • 问题内容: DataflowAnomalyAnalysis:找到变量“ variable”(行“ n1”-“ n2”)的“ DD”异常。 DataflowAnomalyAnalysis:找到变量“ variable”(行“ n1”-“ n2”)的“ DU”异常。 DD和DU听起来很熟悉…我想在涉及最差的前后条件的测试和分析中说些什么,但我不记得具体情况。 NullAssignment:将Objec

  • 本文向大家介绍为什么Node.js会这么火呢?Node.js流行的原因,包括了为什么Node.js会这么火呢?Node.js流行的原因的使用技巧和注意事项,需要的朋友参考一下 Node.js是一项服务器技术,它用来构建和运行Web应用,这和ASP.NET,Ruby on Rails或Spring框架做的工作是类似 的。它使用JavaScript作为主要的开发语言,有一个自带的轻量级Web服务器,还

  • 问题内容: 我偶然发现了这一点: 抛出一个。现在,我知道为什么会发生这种情况(在此作用域之后,是受约束的,因此在整个作用域中被认为是局部的)。 在这种情况下: 这很有道理。但是第一种情况具有直观的逻辑,这意味着: 我想这是有原因的,为什么不允许“直观”版本,但这是什么?尽管这可能是“显式比隐式更好”的情况,但总是对我摸索总是觉得不干净。 从一个角度来看,发生在我身上的实际情况是我不得不改变一下别人

  • 问题内容: 在回答这个问题时,我和其他一些人实际上认为是错误的,因为认为以下方法可行: 说一个有 背后的原因是什么 而有一个 要么 要么 是造成尺寸 退化的 原因吗? 问题答案: 是对象dtype的2D数组,每行的第一个元素是一个列表。 是对象dtype的一维数组,其每个元素都是列表。 当您这样做时,NumPy不会对list的每个元素进行元素比较。它从中创建尽可能高维的数组,生成1D数组,然后广播

  • 下面我写了一个C++函数,它通过一个整数向量进行循环。每通过一次,它就从所有的数字中减去最小的数字。它应该在每次传递时返回非零元素的数量(这存储在向量结果中并返回)。然而,每当我尝试运行时,我都会得到“std::bad_alloc”。当删除行“flag=true”时,错误就会消失。我将需要它工作,以便while循环中断。帮我修好这个。