簡體   English   中英

java同步和對象鎖

[英]java synchronize and object lock

假設我有兩個線程。 Thread1正在訪問同步方法,同時,Thread2正在訪問同一對象的另一個同步方法。 據我所知,Thread2應該等到Thread1完成它的任務。 我的問題是,對象的等待線程列表上是否有Thread2? 對我來說似乎是這樣,但是Thread2不會調用wait()方法,然后作為邏輯結果,它不應該在對象的等待線程列表上。 如果它不在對象的等待線程列表中,那么Thread2的狀態是什么?

當Tread2等待Thread1釋放Thread1持有的內部鎖時,它會被阻塞,直到本機鎖變為可用(如執行線程Thread1釋放的那樣)。 因此,在夏天,Thread2正在等待釋放鎖,因此它可以獲取它。

現在,當一個線程調用wait()它必須已經擁有內部鎖 wait()調用然后釋放鎖 ,並將線程置於等待狀態,等待來自notify()notifyAll()的信號繼續執行。

因此,這兩種情況是不同的,前者是關於執行隱式地被阻止,直到資源(鎖)變得可用。 雖然后者是關於明確釋放已經保持的鎖定,然后等待其時間重新獲取鎖定並繼續的信號。

這兩種情況之間存在差異,因為您需要注意。

當一個線程試圖運行一個synchronized塊,但是其他一些線程持有監視器的鎖時,傳入的線程被阻塞 ,直到鎖被釋放並被授予它。

對於調用wait()的線程,它必須已經保持監視器的鎖定(這是一個相關的區別)。 此外,調用wait()會使線程等待 (釋放鎖定),通常直到其他線程通知它為止。

在理想情況下, 通常上面應該總是如此 ,但是,如Java文檔中所指出的,可能會出現稱為虛假喚醒的現象,使得等待線程無緣無故地喚醒。 這就是為什么等待條件應該用while語句括起來,而不是if 例:

synchronized (this) {
    while (x < 0) { wait(); }
}

代替:

synchronized (this) {
    if (x < 0) { wait(); }
}

暫無
暫無

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

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