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