这是最近面试遇到的一个问题。
用JAVA写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出。
这个问题似乎不是很难,我想说的就是,这个要考察什么吗?为什么是2个加1,2个减1,而不是1个加,一个减1,他们这样出题有什么潜台词吗?
可能我不是很清楚线程的意义吧,大家随便回答的。

解决方案 »

  1.   

    要输出什么效果呢?
    是不是两个线程对1个变量加1,而另外两个线程对这个变量减1,
    然后输出的结果只能是 0或1,不能有其他的值?
    我觉得几个好像没有什么玄机吧,
    主要是考察多线程的同步控制,
    写几个同步块或者同步方法,然后用wait,notify做一些同步的控制。
      

  2.   

    因为是多线程,那么在某个时刻,线程1可能把变量a加1,然后输出加一后的结果,但是因为这个输出过程需要一定的时间(虽然很短),有可能在这个过程中线程2又对变量a进行加1操作,比如,a=1,线程1执行a++;然后输出;但是如果在加1后、输出前线程2又进行了a++;操作,那么线程1就可能输出3了。 
    “二个加1,二个对一个变量减一,”这句话的意思应该就是让你测试这种可能性,让你通过线程同步来解决这种问题。
      

  3.   

    网上找的public class ThreadTest1{    
    private int j;    
    public static void main(String args[]){    
    ThreadTest1 tt=new ThreadTest1();    
    Inc inc=tt.new Inc();    
    Dec dec=tt.new Dec();    
    for(int i=0;i<2;i++){    
    Thread t=new Thread(inc);    
    t.start();    
    t=new Thread(dec);    
    t.start();    
    }    
    }    
    private synchronized void inc(){    
    j++;    
    System.out.println(Thread.currentThread().getName()+"-inc:"+j);    
    }    
    private synchronized void dec(){    
    j--;    
    System.out.println(Thread.currentThread().getName()+"-dec:"+j);    
    }    
    class Inc implements Runnable{    
    public void run(){    
    for(int i=0;i<100;i++){    
    inc();    
    }    
    }    
    }    
    class Dec implements Runnable{    
    public void run(){    
    for(int i=0;i<100;i++){    
    dec();    
    }    
    }    
    }    
    }