new Thread () {
 public void run() {
 synchronized(s1) {
 s2.append("A");     <<<<-----如果楼主这个地方没有写错的话,这个程序的运行结果完全正常
 synchronized(s2) {
 s2.append("B");
 System.out.print(s1);
 System.out.print(s2);
 }
 }
 }
 }.start();

解决方案 »

  1.   

    感觉上,这个程序的输出也是有一定条件的:第一个线程要比第二个线程启动地快,并且会同时获得s1和s2的锁.new Thread () {
     public void run() {
     synchronized(s1) {         //获得s1的锁           
     s2.append("A");            //s2 = "A"
     synchronized(s2) {         //获得s2的锁            (1)
     s2.append("B");            //s2 = "AB"
     System.out.print(s1);      //s1为""  ==>印出""
     System.out.print(s2);      //s2="AB" ==>印出"AB"
     }
     }
     }
     }.start();
     new Thread() {
     public void run() {
     synchronized(s2) {    //根据前面所说的第一个线程,先在(1)处获得了s2的锁==>只有前面第一个线程执行完毕后才会执行这个线程
     s2.append("C");       //第一个线程执行完毕后, s2="AB" ==>现在s2="ABC"
     synchronized(s1) {    //获得s1的锁,可获得,因为第一个线程执行完毕后释放了s1的锁
     s1.append("D");       //原来s1=""  ===> s1 = "D"
     System.out.print(s2); //s2 = "ABC"  ==>印出"ABC"
     System.out.print(s1); //s1 ="D"     ==>印出"D"
     }
     }
     }
     }.start();根据前面的分析,输出为: 空ABABCD