public class Test implements Runnable { public static MyThread1 mt = new MyThread1();
public static void main(String[] args) {
Thread t = new Thread(new Test());
t.start();
new MyThread1().change();
} @Override
public void run() {
mt.Show();
}
}class MyThread1{

public synchronized void Show(){
System.out.println("a");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b");
}

public synchronized void change(){
System.out.println("1");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2");
}
}
这样子它不是应该先打印:
1
2
a
b
可是结果却是:
1
a
b
2
它们都拿到锁了,不是该把change()里面的打印完才执行show()的吗。怎么会这样?!

解决方案 »

  1.   

    sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。
    调用sleep了肯定要交出线程的控制权
      

  2.   

    synchronized 
    Thread.sleep
    去掉之后就符合您的打印要求
      

  3.   

    你调用的是两个不同的方法,用synchronized进行线程同步是两个线程调用同一个方法时,
    Thread t1 = new Thread(new Test());
    Thread t2 = new Thread(new Test());
    t1.start();
    t2.start();
    //new MyThread1().change();
    然后运行一下,
    和把show方法的synchronized去掉再运行的结果比较,看看有什么不同就知道了
      

  4.   

    你的synchonized是加在方法上的,所以必须针对的是同一个对象。如你的代码,你创建了两个不同的对象,两个线程各自在自己的对象上加锁,所以是相互不影响的。
      

  5.   

    你的synchonized是加在方法上的,所以必须针对的是同一个对象
    我博客里就有 可以看看去