为什么同步方法只能依次由两个线程调用?

时间:2019-05-09 14:06:09

标签: java multithreading synchronized

我在课堂上有一个同步方法。 try子句中的代码调用znotifyAll()。当我运行代码时,所有线程都根据输出运行。但是事实证明只有两个线程依次调用该方法。太可怕了。

我试图在一个非同步方法的while循环中编写一个同步块,并且效果很好。请注意,总共有5个线程。

这是同步方法:

wait()

我还试图将while循环放入同步块中,发生了同样的事情。

private synchronized void sell() {
        while (ticketsLeft > 0) {
            try {
                    System.out.println(Thread.currentThread().getName() + "__________" + (ticketsLeft--));
                    this.notifyAll();
                    Thread.sleep(10);
                    this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.exit(0);
    }

它的工作原理是,线程3和4依次调用该方法:

private void sell() {
        synchronized (this) {
            while (ticketsLeft > 0) {
                try {
                    System.out.println(Thread.currentThread().getName() + "__________" + (ticketsLeft--));
                    this.notifyAll();
                    Thread.sleep(10);
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.exit(0);
        }
    }

在非同步方法内的while循环中使用同步块:

5__________100
1__________99
2__________98
3__________97
4__________96
3__________95
4__________94
3__________93
4__________92
3__________91
4__________90
3__________89
4__________88
3__________87
4__________86
3__________85
4__________84
3__________83
4__________82
3__________81
4__________80

它按我的预期工作:

    private void sell() {
        while (ticketsLeft > 0) {
            try {
                synchronized (this) {
                    System.out.println(Thread.currentThread().getName() + "__________" + (ticketsLeft--));
                    this.notifyAll();
                    Thread.sleep(10);
                    this.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.exit(0);
    }

谢谢你们阅读这个问题。很抱歉,我没有足够的声誉来发布图像。如果有人对此有任何想法,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

这里没有足够的信息来正确回答问题。但是,我认为这与在第二种情况下while循环位于同步块外部以及在第一种情况下while循环在同步方法内部有关。

在第二种方法中,所有线程将在while循环内等待,但对于第一种方法,它们将在while循环之外等待。

注意:同步方法和同步方法都在运行线程的类的当前实例上具有锁定。

希望这会有所帮助!! :-)