Interview 丨 一道java面试题

    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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值