一道java面试题

public class test1 {
    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未改变

谢耳朵449144
浏览 2786回答 13
13回答

白绿色

其实答案是不定的,看哪个线程先抢到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; }

JustWannaHugU

我选A都未改变

krisleo

abcd都可能,看那个线程抢到CPU,另一个线程执行到什么地方,抢CUP是不固定的,所以所有的答案理论上运行无限次时候是都有可能发生的。

灬elliott

祝你面试顺利

惟愿_无事常相见

我肿么感觉abcd=_=

噼喱啪啦

贴出全部代码我好看清楚。

绿洲仙人球

建议提问者把输出调用方法的代码也贴出来,我通过new test1 的方法创建一个实例,然后调用方法,输出的答案是BJava中没有全局变量的概念,需要分清是对变量的引用改值还是对变量本身改值

和木雪3217235

选A吧。不过不知道你的截图是不是整个题目的。虽然你定义了foo函数。在里面重新定义了A,B的值。但是你并没有对foo这个函数有过操作。所以,a、b的值都是原来初始化的时候的值、

qq_淡然的微笑

说一下选A的原因啊,大神求指教

ziom

选A.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java