在这里,我写了一个测试大约地方,成员,volatile成员的访问速度:为什么访问volatile变量比成员慢100左右?
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 成员:312 VMember:33378
回合:2 空:31 本地:0 成员:294 VMember:33180
回合:3 空:0 本地:0 成员:306 VMember:33085
回合:4 空:0 本地:0 成员:300 VMember:33066
回合:5 空:0 本地:0 会员:303 VMember:33078
回合:6 空:0 本地:0 成员:299 VMember:33398
回合:7 空:0 本地:0 成员:305 VMember:33139
回合:8 空:0 本地:0 会员:307 VMember:33490
回合:9 空:0 本地:0 成员:350 VMember:35291
回合:10 空:0 本地:0 成员:332 VMember:33838
令我惊讶的是访问易失性构件比正常构件慢100倍。我知道有一些关于volatile成员的高亮功能,比如对它的修改会立即对所有线程都可见,访问点volatile变量扮演着“内存障碍”的角色。但是,所有这些副作用是否会成为100倍慢的主要原因?
PS:我也在Core II CPU机器上做过测试。大约9:50,大约慢了5倍。似乎这也与CPU拱有关。 5次还是很大的吧?
可能重复的[Is volatile expensive?](http://stackoverflow.com/questions/4633866/is-volatile-expensive) –
看着它... – DeepNightTwo