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线程,不应该的呀,应该一个第一个使用,一个第二个使用啊!!!!!!!!

解决方案 »

  1.   

    Thread.sleep(1); 这1毫秒已经足够两个线程都执行完 num++了吧。到了System.out.println这里,num肯定已经是2了啊。
      

  2.   

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

  3.   

    我用了synchronized进行锁定啊!!
    一个进程进行完了另一个才能进行啊!!!
      

  4.   

    对synchronized不熟悉吧。public synchronized void add(String name)
    对成员函数做synchronized,必须是同一个对象才会有互斥访问的效果。你的代码中:
            TestSync ts1 = new TestSync();
            TestSync ts2 = new TestSync();
    明显是两个不同的对象,各自锁各自的,互不影响。
      

  5.   


    Timer t = new Timer(); 是个成员变量,每个实例都有一个。static Timer t = new Timer(); 是个类静态变量,所有实例共用一个。也就是改为static后,不管你new多少个TestSync()实例,Timer始终只有一个,那么add()也就是同一个了。
    类似的,你还可以只把add()函数改为 static 的。