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

关于锁的问题。。。
public class TestSync implements Runnable {
  Timer t = new Timer();
public static void main(String[] args) {
TestSync ts = new TestSync();
Thread t1 = new Thread(ts);
Thread t2 = new Thread(ts);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
  public void run(){
t.add(Thread.currentThread().getName());
  }
}
class Timer{
private static int n = 0 ;
public synchronized void add(String name){
n ++ ;
try{
Thread.sleep(10);
}catch(InterruptedException e){}
System.out.println(name+"你好,你是第"+n+"个线程!");
}

}
理想结果:t1是第一个线程
  t2是第二个线程。
 但显示出来居然是::
  t2是第一个线程
  t1是第二个线程。
  难到synchronized没有把add方法锁定?

------解决方案--------------------
start()方法只是提醒jvm,可以调用run()方法了,而不是马上就调用
------解决方案--------------------
不同的机器上跑出来的结果可能不一样,刚刚帮你测试了一下,在我的机器上是你想要的结果,你的程序是没问题的
------解决方案--------------------
你把sleep去掉,多跑几次,就发现打印出来的语句是随机的
你不能控制哪个线程先跑哪个后跑
------解决方案--------------------
这个问题,不在于add方法那

.............
.............
t1.setName("t1");
t2.setName("t2");

执行到这时,线程的名字是t2,再往下走
t1.start();
t2.start();
这里不是t1写在上面就一定先执行,cpu有可能是在要执先t1线程时停止,而转去执行t2线程。这就是多线程的意义。