请看如下代码:public class SyncTest{
public synchronized void cygnus(){
for(int i=1;i<6;i++)
System.out.println("[Cygnus]"+i);
} public synchronized void draco(){
for(int i=1;i<6;i++)
System.out.println("[Draco]"+i);
} public static synchronized void pegasus(){
for(int i=1;i<6;i++)
System.out.println("[Pegasus]"+i);
} public static void main(String[] args) throws Exception{
SyncTest sync = new SyncTest();
new T1(sync).start();
new T2(sync).start();
new T3(sync).start();
}
}class T1 extends Thread{
private SyncTest sync;
public T1(SyncTest sync){
this.sync = sync;
}

public void run(){
sync.cygnus();
}
}class T2 extends Thread{
private SyncTest sync;
public T2(SyncTest sync){
this.sync = sync;
}

public void run(){
sync.draco();
}
}class T3 extends Thread{
private SyncTest sync;
public T3(SyncTest sync){
this.sync = sync;
}

public void run(){
sync.pegasus();
}
}
请问下面哪些输出结果是可能的,哪些是不可能的:
A: [Cygnus]1
   [Cygnus]2
   [Cygnus]3
   [Cygnus]4
   [Pegasus]1
   [Cygnus]5
   [Pegasus]2
   [Draco]1
   [Pegasus]3
   [Draco]2
   [Pegasus]4
   [Draco]3
   [Pegasus]5
   [Draco]4
   [Draco]5B: [Cygnus]1
   [Cygnus]2
   [Cygnus]3
   [Cygnus]4
   [Pegasus]1
   [Draco]1
   [Cygnus]5
   [Pegasus]2
   [Pegasus]3
   [Draco]2
   [Pegasus]4
   [Draco]3
   [Pegasus]5
   [Draco]4
   [Draco]5C: [Pegasus]1
   [Cygnus]1
   [Cygnus]2
   [Cygnus]3
   [Cygnus]4
   [Cygnus]5
   [Draco]1
   [Draco]2
   [Draco]3
   [Pegasus]2
   [Pegasus]3
   [Pegasus]4
   [Pegasus]5
   [Draco]4
   [Draco]5D: [Cygnus]1
   [Cygnus]2
   [Pegasus]1
   [Pegasus]2
   [Draco]1
   [Draco]2
   [Draco]3
   [Cygnus]3
   [Cygnus]4
   [Cygnus]5
   [Pegasus]3
   [Pegasus]4
   [Pegasus]5
   [Draco]4
   [Draco]5

解决方案 »

  1.   


    3楼的是猜,4楼是实践后的结果因为cygnus、draco、pegasus都有synchronized,不过pegasus是static synchronized所以前2者属于实例同步,后者是属于类型同步
    他们是各不同的同步锁
    最终保证cygnus输出1-5、draco输出1-5,各自都是顺序就可以
      

  2.   

    public   static   void   main(String[]   args)   throws   Exception{ 
    SyncTest   sync1   =   new   SyncTest(); 
    SyncTest   sync2   =   new   SyncTest(); 
    new   T1(sync1).start(); 
    new   T2(sync2).start(); 
    // new   T3(sync).start(); 

    } 相当于这样
      

  3.   

    一个实例锁,一个是类锁所以你可以再试试写个static synchronized的方法,测试一下
      

  4.   


    cygnus输出1-5、draco输出1-5,pegasus输出也是1-5
      

  5.   

    我直接拷贝你的代码,跑出来都是1-5啊  先后顺序cygnus输出1-5、draco输出1-5,pegasus输出也是1-5
      

  6.   

    SyncTest   sync   =   new   SyncTest();一个是sync
    一个是SyncTest.class
      

  7.   

    答案应该是AC public   synchronized   void   draco()
    public   synchronized   void   draco()
    这两个方法都是给 运行时 this 对像加锁 
    public   static   synchronized   void   pegasus()
    这个方法因为是静态方法 所以在类没有创建的情况下。。是可以被调用 那么它加锁的对像就不可能是运行时的 this 
      

  8.   

    27楼是正解。
    因为cygnus和draco方法锁定的是同一个对象,所以draco方法必须等到cygnus方法运行完释放这个锁后才能运行,以此对照答案只有AC是理论上可能出现的结果(实际运行时最可能出现的结果是方法123依次打印出12345).