gpt4 book ai didi

java - 为什么访问 volatile 变量比 member 慢 100 左右?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:07:34 26 4
gpt4 key购买 nike

这里我写了一个关于local、member、volatile成员访问速度的测试:

public class VolatileTest {

public int member = -100;

public volatile int volatileMember = -100;

public static void main(String[] args) {
int testloop = 10;
for (int i = 1; i <= testloop; i++) {
System.out.println("Round:" + i);
VolatileTest vt = new VolatileTest();
vt.runTest();
System.out.println();
}
}

public void runTest() {
int local = -100;

int loop = 1;
int loop2 = Integer.MAX_VALUE;
long startTime;

startTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
for (int j = 0; j < loop2; j++) {
}
for (int j = 0; j < loop2; j++) {
}
}
System.out.println("Empty:" + (System.currentTimeMillis() - startTime));

startTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
for (int j = 0; j < loop2; j++) {
local++;
}
for (int j = 0; j < loop2; j++) {
local--;
}
}
System.out.println("Local:" + (System.currentTimeMillis() - startTime));

startTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
for (int j = 0; j < loop2; j++) {
member++;
}
for (int j = 0; j < loop2; j++) {
member--;
}
}
System.out.println("Member:" + (System.currentTimeMillis() - startTime));

startTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
for (int j = 0; j < loop2; j++) {
volatileMember++;
}
for (int j = 0; j < loop2; j++) {
volatileMember--;
}
}
System.out.println("VMember:" + (System.currentTimeMillis() - startTime));

}
}

这是在我的 X220(I5 CPU)上的结果:

第 1 轮空:5本地:10成员(member):312VM成员(member):33378

第 2 轮空:31本地:0成员(member):294VM成员(member):33180

第 3 轮空:0本地:0成员(member):306VM成员(member):33085

第 4 轮空:0本地:0成员(member):300VM成员(member):33066

第 5 轮空:0本地:0成员(member):303VM成员(member):33078

第 6 轮空:0本地:0成员(member):299VM成员(member):33398

第 7 轮空:0本地:0成员(member):305VM成员(member):33139

第 8 轮空:0本地:0成员(member):307VM成员(member):33490

第 9 轮空:0本地:0成员(member):350VM成员(member):35291

第 10 轮空:0本地:0成员(member):332VM成员(member):33838

令我惊讶的是,访问 volatile 成员比普通成员慢 100 倍。我知道关于 volatile 成员有一些突出的特性,比如对它的修改将立即对所有线程可见,对 volatile 变量的访问点起着“内存屏障”的作用。但所有这些副作用会不会是慢 100 倍的主要原因?

PS:我也在Core II CPU机器上做过测试。大约是9:50,慢了大约5倍。似乎这也与 CPU 架构有关。 5 倍还是很大吧?

最佳答案

volatile 成员从不缓存,因此直接从主内存中读取。

关于java - 为什么访问 volatile 变量比 member 慢 100 左右?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11132087/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com