这两个程序产生不同的输出。为什么?为什么第一个程序重复0101而第二个程序不重复? 另外,如果在系统时间内看到forst程序的输出,我看到有很多次打印1和0时有相同的时间。怎么样?
两个代码之间的区别是什么?
这是带有同步对象示例的程序。
public class T extends Thread {
private String info;
static Object o = new Object();
public T (String info) {
this.info = info;
}
public void run () {
synchronized ( o ) {
while ( true ) {
System.out.println(info);
try {
o.notify();
sleep(100);
o.wait();
} catch ( Exception e ) { }
}
}
}
public static void main (String args []) {
( new T("0") ).start();
( new T("1") ).start();
}
}
Program 2:
public class H extends Thread {
String info = "";
public H (String info) {
this.info = info;
}
public synchronized void run () {
try {
while ( true ) {
System.out.println(info);
this.notify();
this.wait();
}
} catch ( Exception e ) {}
}
public static void main (String args []) {
new H("0").start();
new H("1").start();
}
}
答案 0 :(得分:1)
在程序1中,两个线程与static Object o = new Object();
同步,这是类变量。只有两个线程中的一个可以进入同步块。
但是程序2中的每个线程都与自身同步。一个人不等待对方释放锁。它们是独立执行的。
如果变量o
被声明为类T的实例成员(没有static
),则结果与程序2相同。