2014-10-02 44 views
2

我熟悉基本的Java線程機制,但是,對某個特定情況感到困惑。以下是示例代碼。Java - 同步塊上的字節[]

static byte[] syncBuf; 

// synchronized block of code 
synchronized(syncBuf) { 
    // Call non-synchronized method 
    methodA(syncBuf); 
} 

我的問題是如果多個線程執行上面的代碼,將下一個線程塊,直到了methodA()執行完畢,因爲我們正在持有鎖syncBuf其通過引用傳遞。

編輯:

如果我更改上面的代碼與下面的情況:

static byte[] syncBuf; 

// synchronized block of code 
synchronized(syncBuf) { 
    // Call non-synchronized method in a new thread 
    new Thread(new Runnable() { 
    @Override 
    public void run() { 
     methodA(syncBuf); 
    }}).start(); 
} 

請問上述解釋仍持有?下一個線程會阻塞,直到methodA() - 線程執行完畢嗎?

回答

3

你的解釋是(大部分)是正確的。調用該代碼的任何其他線程都會阻塞,直到線程退出同步塊(稍後methodA返回)。

在Java中,數組也是可以同步的對象。

您可以隨時實驗和嘗試,驗證,無論是通過使用調試器或明智地使用Thread.sleep代碼的功能,看看其他線程可以得到。

你的編輯是一個完全不同的情況下,雖然 - 在這裏,您的主線程會鎖定syncBuf,啓動一個線程,然後釋放該鎖。該線程不會獲取鎖(在run()內),因此對methodA(syncBuf)的調用不會獲取任何鎖或進行任何阻塞。這與在這裏匿名Runnable實例在其他地方定義的相同(例如在它自己的類中)。

+0

是的,我試過這麼做。但是,在進入同步代碼塊之前,syncBuf既不會被搞亂,也不會被調用線程長時間阻塞。不知道如何驗證它。 – pree 2014-10-03 00:03:00

+0

以上評論是針對我編輯的問題。我可以在第一種情況下驗證它。調用線程在第一種情況下會被阻塞。 – pree 2014-10-03 00:13:03

1

關於你的編輯

請問上述解釋仍持有?下一個線程會阻止 ,直到methodA() - 線程執行完畢嗎?

您創建一個新的線程調用其異步methodA。從當前線程的角度來看,即。在syncBuf上擁有鎖的那個,你調用了Thread#start()方法,該方法立即返回並退出​​塊,釋放該鎖。

0

Chris和Sotirios Delimanolis的上述答案都是正確的。我只是將其中的一個標記爲涵蓋兩種情況的答案。