小编ssc*_*ieb的帖子

如果执行顺序(几乎)不受影响,如何在严重的性能下降中分配变量结果?

在玩多线程时,我可以观察到与AtomicLong(以及使用它的类,例如java.util.Random)相关的一些意外但严重的性能问题,我目前没有解释.但是,我创建了一个简约示例,它基本上由两个类组成:一个类"Container",它保存对volatile变量的引用;一个类"DemoThread",它在线程执行期间对"Container"实例进行操作.请注意,对"Container"和volatile long的引用是私有的,并且从不在线程之间共享(我知道这里不需要使用volatile,它仅用于演示目的) - 因此,"DemoThread"的多个实例应该完美运行在多处理器机器上并行,但由于某种原因,它们没有(完整示例位于本文的底部).

private static class Container  {

    private volatile long value;

    public long getValue() {
        return value;
    }

    public final void set(long newValue) {
        value = newValue;
    }
}

private static class DemoThread extends Thread {

    private Container variable;

    public void prepare() {
        this.variable = new Container();
    }

    public void run() {
        for(int j = 0; j < 10000000; j++) {
            variable.set(variable.getValue() + System.nanoTime());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我重复创建了4个DemoThreads,然后启动并加入.每个循环的唯一区别是"prepare()"被调用的时间(这显然是线程运行所必需的,否则会导致NullPointerException):

DemoThread[] threads = new DemoThread[numberOfThreads];
    for(int j = 0; j …
Run Code Online (Sandbox Code Playgroud)

java performance multithreading jvm volatile

19
推荐指数
2
解决办法
409
查看次数

标签 统计

java ×1

jvm ×1

multithreading ×1

performance ×1

volatile ×1