簡體   English   中英

在同步代碼塊中調用Java Timer

[英]Calling java timer in a synchronized block of codes

如果我有一個稱為A的父代碼塊,則A被同步。 在A中,我執行了一個稱為B的代碼子塊。我是否也認為B也將被同步?


如果在AI中有一個計時器在一定的t時間內延遲B的執行,那么當A已經完成時,是否有可能B在以后執行?


非常感謝你。


P / S:對不起,不清楚的代碼,這就是它的外觀

   synchronized  A{
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
      @Override
      public void run() {
        B block
      }
    }, 2*60*1000);

    } 

要看。 如果塊B是這種方法中的代碼塊,則可以...它將被同步。

public synchronized void methodA() {
    // Block B
    {
       // some code
    }
}

如果是如下所示的另一種方法,則否:

public synchronized void methodA() {
    methodB();
}

public void methodB() {
    // Block B code
    // Nothing prevents an unsynchronized method from calling this method
    //   at same time as methodA() holds  lock on `this` object
}

除非methodB也被標記為已synchronized 已從另一個同步方法(例如, public synchronized methodC()public synchronized methodC() 或使用了另一個同步機制,否則methodB()將不會同步。

這些只是最簡單的情況。 你已經開發布示例的代碼,因為“塊”沒有很好默認定義和同步鎖的類型(關於隱式更好this通過同步方法與明確的對象鎖)有差別。

但是,您的最后一行聽起來像是您在詢問同步執行代碼還是異步執行代碼,盡管與線程和synchronized塊有關,但這是一個不同的概念。

在那種情況下,這取決於在block A發生的事情……如果創建了新的線程來執行block B那么在代碼執行的時間上可能發生任何事情。 如果沒有創建線程,則可以安全地假設block Ablock B之前不會完成。

編輯:基於現在發布的代碼...同步的A block將僅確保一次創建Timer線程。 但是,除非Java Timer框架有什么特別之處,否則沒有什么可以阻止兩個線程在run方法中同時執行B block的…所以確保內容是線程安全的。

也就是說,不要僅僅因為在相同的延遲下在同步塊中創建了Timer不同實例,就不會假設它們不會同時進入run方法。 如果B block訪問外部的非線程安全代碼(例如,靜態方法,磁盤訪問),您可能會感到驚訝。

正如Amm Sokun在其他答案中提到的那樣, A{}將在Block B執行之前返回。

塊B將在A完成執行后執行,這是因為在方法A中,您只是將B調度為在2*60*1000毫之后運行,而計時器將在2*60*1000毫之后執行B

暫無
暫無

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

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