一道java面试题

来源:互联网 发布:snmp windows版本 编辑:程序博客网 时间:2024/06/04 17:46
    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;}
1 0