public class test {
private int a=1, b=2;
public void foo(){
a=3;
b=4;
}
public int getA(){
return a;
}
public int getB(){
return b;
}
}
当线程1执行foo方法的时候,线程2访问getA和getB会得到什么样的结果?
A. a=1, b=2 //都未改变
B. a=3, b=4 //都改变了
C. a=3, b=2 //a改变了,b未改变
D. a=1, b=4 //b改变了,a未改变
其实答案是不定的,看哪个线程先抢到cpu时间。不能用代码的先后顺序决定线程的执行顺序。而且线程有没有加锁等等都会影响。
就这个例子来说大多数情况都变。
public static void main(String[] args) {
final test1 t = new test1();
new Thread() {
public void run() {
t.foo();
}
}.start();
new Thread() {
public void run() {
System.out.println(t.getA() + "--" + t.getB());
}
}.start();
}
但是实际项目中如果foo()执行的时间长,可能foo还没执行完,cpu就会把时间片切换到第二个线程执行。
所以每次的结果可能都不一样。
例如把foo()改成这样,让它的执行时间变长,可能就都不变。把循环次数改小,执行时间变短,可能都变
public void foo(){
long i = 0;
while(i<1000000000) {
int c = a + b;
i++;
}
a=3;
b=4;
}