簡體   English   中英

在對象上通知后返回同步塊后java的行為是什么

[英]what is the behavior of java after returning to a synchronized block after notify on an object

我知道在我們對一個對象調用wait() ,該對象的鎖將釋放以允許另一個線程通過同步塊提供該鎖並調用notify() 在我們進入我們調用wait()方法的同步塊之前,我們獲取鎖並調用wait()

但是在wait()該方法釋放了鎖。

現在我的問題是在另一個線程中調用notify()之后,等待該對象的線程是否再次獲取鎖。

下面是一個簡單的代碼:

Object obj = new Object();
        synchronized (obj) {
            try {
                obj.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            afterWait();
        }

是jvm執行afterWait()方法時獲取對象的鎖與否,因為它也在同步塊中。

在 Java 中,監視器是根據 Mess 的語義實現的。 這意味着當當前線程需要等待時,它會釋放監視器並加入其他等待線程以再次獲取監視器。 所寫的示例並不安全,因為 wait 應該在循環中檢查某些條件以再次等待,因為 Java 不保證只有在notify()notifyAll()方法的情況下才會喚醒線程。 它可能適用於您的開發環境,但在另一個環境中失敗。 此外, notify()方法不保證線程會喚醒並獲得鎖,因為它可能無法獲得信號,因此執行notifyAll()以喚醒所有等待鎖的線程是安全的。

我是 Stack Overflow 的新手,所以我不確定我的共享知識是否直接針對問題。

來自wait()Javadoc (強調):

當前線程必須擁有此對象的監視器。 線程釋放此監視器的所有權並等待,直到另一個線程通過調用 notify 方法或 notifyAll 方法通知在此對象監視器上等待的線程喚醒。 然后線程等待直到它可以重新獲得監視器的所有權並恢復執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM