当前位置: 代码迷 >> J2SE >> 救救命呀,scjp有关问题,就要考了
  详细解决方案

救救命呀,scjp有关问题,就要考了

热度:67   发布时间:2016-04-24 16:31:08.0
救救命呀,scjp问题,就要考了
就2个问题,帮忙看下,谢谢
问题1:
class   fuck{
int   x=0;
public   class   runner   implements   Runnable{
public   void   run(){
int   c=0;
for(int   i=0;i <4;i++){
c=x;
System.out.print   (c+ ", ");
x=c+2;
}
}
}
public   static   void   main(String   args[]){
new   fuck().go();
}
public   void   go(){
Runnable   r1=new   runner();
new   Thread(r1).start();
new   Thread(r1).start();
}
}

答案说可能输出
0,2,4,4,6,8,10,6,
我总觉得不可能。请解释为什么?x的值在不断增大,c的值怎么还会变小(从10到6),貌似跟同不同步没有关系,是不是答案错啦?

问题2:
class   a{
private   String   s1= " ";
public   String   get(){
return   s1;
}
public   void   set(String   d){
s1=d;
}
public   static   void   modi(a   a,String   s1){
a=new   a();
a.set(s1);
}
public   static   void   main(String   args[]){
a   a=new   a();
a.set( "G ");
a   b=new   a();
b.set( "F ");
modi(a, "S ");
System.out.print   (a.get());
System.out.print   (b.get());
}
}

我的问题是:为什么输出是GF,而不是SF.
如果你认为这个问题很简单,请看下面一个程序:

class   fuck{
public   static   void   main(String   args[]){
fuck   f=new   fuck();
f.start();
}
void   start(){
long   a1[]={1,2,3};
long   a2[]=modi(a1);
System.out.print   (a1[0]+a1[1]+a1[2]+ "   ");
System.out.println   (a2[0]+a2[1]+a2[2]);
}
long[]   modi(long   a3[]){
a3[2]=4;
return   a3;
}
}

以上输出为什么是:7   7
而不是7   6


谢谢谢谢谢谢谢谢

------解决方案--------------------
第1题:
0,2,4,4,6,8,10,6

两个线程对x进行读写
前面的0,2,4,4,6 好理解,就不多说了,下面说后面的

其中一个线程执行到 c=x; //x = 6 时忽然由于各种原因被阻塞了

这里另一个线程继续执行,输出6,8,10 然后线程自然终止

这时前面阻塞的线程被唤醒,继续执行,由于每个线程都拥有自己的变量c,所以仍然输出6


当然,这只是可能的线程执行顺序。总之在多线程的情况下,你不能假设线程按照你的设想来运行。推荐看看操作系统相关知识,或者Java线程方面的书籍...