请看如下代码: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
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
3楼的是猜,4楼是实践后的结果因为cygnus、draco、pegasus都有synchronized,不过pegasus是static synchronized所以前2者属于实例同步,后者是属于类型同步
他们是各不同的同步锁
最终保证cygnus输出1-5、draco输出1-5,各自都是顺序就可以
SyncTest sync1 = new SyncTest();
SyncTest sync2 = new SyncTest();
new T1(sync1).start();
new T2(sync2).start();
// new T3(sync).start();
}
} 相当于这样
cygnus输出1-5、draco输出1-5,pegasus输出也是1-5
一个是SyncTest.class
public synchronized void draco()
这两个方法都是给 运行时 this 对像加锁
public static synchronized void pegasus()
这个方法因为是静态方法 所以在类没有创建的情况下。。是可以被调用 那么它加锁的对像就不可能是运行时的 this
因为cygnus和draco方法锁定的是同一个对象,所以draco方法必须等到cygnus方法运行完释放这个锁后才能运行,以此对照答案只有AC是理论上可能出现的结果(实际运行时最可能出现的结果是方法123依次打印出12345).