簡體   English   中英

關於從同步塊調用方法

[英]About calling methods from a synchronized block

正在同步一個等價的方法,只讓一個線程對它進行評估,直到它超出范圍,包括內部方法調用?

例如:

public synchronized void foo(){

    if(critical condition){
        bar();  // can influence the above condition
    }
    baz(); // can influence the above condition
}

可以將兩個線程放在bar (假設它只能從這里調用)?

如果baz可以從除foo之外的代碼中的另一個地方調用,那么可以使用兩個線程嗎?

可以將兩個線程放在bar中(假設它只能從這里調用)?

是的,只要他們使用不同的對象,或者一個是wait() ing。

如果baz可以從除foo之外的代碼中的另一個地方調用,那么可以使用兩個線程嗎?

是的,在一個方法上放置synchronized會對未同步的方法沒有影響。

這是編寫代碼的等效方法:

public void foo(){
    synchronized (this) {
        if(critical condition){
            bar();  // can influence the above condition
        }
        baz(); // can influence the above condition
    }
}

因為synchronized方法實際上使用this作為鎖定對象來同步它們的實體。

那么,兩個線程可以同時執行foo()還是同時執行bar() 當然,如果他們正在執行不同對象的foo()bar()

此外,對baz()的調用根本不同步,因此即使任何兩個線程也可以同時運行單個對象的baz() ,只要其中至少有一個從foo()外部調用它。

這兩個資源有助於理解Java中的同步和不執行的操作:

我建議您檢查這些頁面,因為有些信息在您檢查之前不太明顯。 例如:

  • 兩個不同的線程不能同時執行單個對象的兩個不同的同步方法。
  • 單個線程可以執行同一對象的兩個不同的同步方法(稱為“ 重入同步”

暫無
暫無

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

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