为什么第二个线程没有进入`display()`方法?

时间:2014-03-16 16:09:03

标签: java multithreading synchronized

我正在尝试了解JAVA中的同步。我写了一个小程序。

class A implements Runnable {
    public void run() {
        Random r = new Random();
        int i = r.nextInt(10);          
        if(i<5){
            print();            
        }else{
        display();  
        }
    }

    public synchronized void display()
    {
        System.out.println("display");
        print();                     // Line no: 19
    } 

    public synchronized void print()
    {
        System.out.println("print");

    }
}


public class Test {
    public static void main(String argv[]) throws Exception {
        A a = new A();
        Thread t = new Thread(a, "A");
        Thread t1 = new Thread(a, "B");
        t.start();
        t1.start();
    }
}

考虑第一种情况:我在print方法的第一行放了一个 debug 点。

现在线程A开始运行并且数字随机生成数字 1

它会调用print方法,因为我的第一行有调试点。它会等我恢复。

现在,在此期间,线程B开始运行并编号随机生成的数字 8

它应该调用display方法,但我看到执行没有进入display方法。只有在确保线程A已完成执行后才能进入。

线程B不应该进入display方法并等待line no 19.

同一个对象生成的两个线程不能执行2个不同的同步方法吗?

请解释。

1 个答案:

答案 0 :(得分:0)

要输入对象的同步方法,线程必须获取与该对象关联的内部锁。锁被绑定到对象。每种方法都没有自己的锁。

由于线程A位于Runnable的synchronized方法内,因此另一个线程必须等待锁定被释放才能输入synchronized方法,无论方法是否相同。