在玩多线程时,我可以观察到与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)