为了账号安全,请及时绑定邮箱和手机立即绑定

一道java面试题

一道java面试题

谢耳朵449144 2016-09-12 13:36:18
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未改变
查看完整描述

13 回答

已采纳
?
白绿色

TA贡献3条经验 获得超11个赞

其实答案是不定的,看哪个线程先抢到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 反对 回复 2016-09-12
?
JustWannaHugU

TA贡献452条经验 获得超796个赞

我选A

都未改变

查看完整回答
6 反对 回复 2016-09-12
?
krisleo

TA贡献2条经验 获得超2个赞


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

查看完整回答
1 反对 回复 2016-09-13
?
灬elliott

TA贡献63条经验 获得超17个赞

祝你面试顺利

查看完整回答
反对 回复 2016-09-13
?
惟愿_无事常相见

TA贡献30条经验 获得超25个赞

我肿么感觉abcd=_=

查看完整回答
反对 回复 2016-09-12
?
噼喱啪啦

TA贡献392条经验 获得超170个赞

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

查看完整回答
反对 回复 2016-09-12
  • 噼喱啪啦
    噼喱啪啦
    a=3,b=4 是在一个方法里面操作的。 如果没有调用方法,则值不会改变
?
绿洲仙人球

TA贡献39条经验 获得超47个赞

建议提问者把输出调用方法的代码也贴出来,我通过new test1 的方法创建一个实例,然后调用方法,输出的答案是B

Java中没有全局变量的概念,需要分清是对变量的引用改值还是对变量本身改值


查看完整回答
反对 回复 2016-09-12
?
和木雪3217235

TA贡献13条经验 获得超4个赞


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

查看完整回答
反对 回复 2016-09-12
?
qq_淡然的微笑

TA贡献1条经验 获得超0个赞

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

查看完整回答
反对 回复 2016-09-12
?
ziom

TA贡献948条经验 获得超1109个赞

选A.

查看完整回答
1 反对 回复 2016-09-12
  • 13 回答
  • 7 关注
  • 2785 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信