- 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还是改逻辑为好。。