同步方法和同步对象的输出不同

时间:2013-12-06 00:48:37

标签: java thread-sleep thread-synchronization

这两个程序产生不同的输出。为什么?为什么第一个程序重复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();
    }
}

1 个答案:

答案 0 :(得分:1)

在程序1中,两个线程与static Object o = new Object();同步,这是类变量。只有两个线程中的一个可以进入同步块。

但是程序2中的每个线程都与自身同步。一个人不等待对方释放锁。它们是独立执行的。

如果变量o被声明为类T的实例成员(没有static),则结果与程序2相同。