日期:2014-05-20  浏览次数:20677 次

有关多线程的问题
Java code

public class TestSync implements Runnable {
    Timer t = new Timer();
    
    public static void main(String[] args) {
        TestSync ts1 = new TestSync();
        TestSync ts2 = new TestSync();
        Thread t1 = new Thread(ts1);
        Thread t2 = new Thread(ts2);
        t1.setName("t1");
        t2.setName("t2");
        t1.start();
        t2.start();
        // TODO Auto-generated method stub

    }
    
    public void run(){
        t.add(Thread.currentThread().getName());
        
    }

}

class Timer{
    private static int num = 0;
    public synchronized void add(String name){
        //synchronized (this){
        num ++;
        try{
            Thread.sleep(1);
        }catch(InterruptedException e){}
        System.out.println(name + ",你是第" + num + "个使用timer线程");
    }
    //}
}


调试2次,每次结果竟然是不一样的?这是为啥子嘛?????
第一次是这样滴:
t1,你是第2个使用timer线程
t2,你是第2个使用timer线程
第二次是这样滴:

t2,你是第2个使用timer线程
t1,你是第2个使用timer线程


都是第二个使用timer线程,不应该的呀,应该一个第一个使用,一个第二个使用啊!!!!!!!!

------解决方案--------------------
你new了两TestSync,每个TestSync操作各自的Timeer,所以根本没同步,这也是导致都输出两个“第2个”的原因,你多运行几次一定会看到“第1个”的,即使看到第一个和第二个也不是线程安全的,只是凑巧了。。so,lz还是改逻辑为好。。