2017-10-05 46 views

回答

0

因爲線程2不是試圖獲取任何鎖,所以它不會被阻塞,並且可以與線程1同時運行。沒有什麼特別的你需要做。

+0

啊好吧......一家大銀行的高級開發人員告訴我,作爲採訪的一部分,thread1將獲取該同步塊中整個對象的鎖,因此thread2將無法執行,這讓我困惑......我誤會了什麼,或者他錯了嗎? –

+0

@EvilWashingMachine你不記得沒錯,誤會了他或者他是個白癡。 – Oleg

+2

線程1將獲取對象的鎖定。但是線程2不會嘗試獲取該鎖。所以線程2能夠執行。鎖不知道他們鎖定了什麼。他們在榮譽體系上工作。 –

1

有兩種類型的同步的 1.對象級 2.類級(類級同步僅適用於靜態方法。)

在你的情況,因爲你的方法不是靜態它是對象層級同步。對於對象級同步,您可以同步整個方法,也可以同步某些方法塊。

當你同步一個方法。它意味着你的類的同一個對象不能從不同的線程訪問你的synchronized方法。由於每個對象只有一個鎖。如果你爲同一個obj調用了doSomethingElse(),但是來自不同的線程。然後它將被一個線程訪問。

現在來找你的答案: 因爲你的第一個方法是不同步的,即東西()。在任何情況下,如果你爲任何線程調用它,甚至當你的第一個線程當前在方法中時調用它,它都不會受到影響。 鎖只synchronized方法

Yourclass obj = new Yourclass(); 
Thread A = new MyThread(obj); 
Thread B = new MyThread(obj); 

......

public void run() 
{ 
    \\do what ever you want 
    \\both of your methods will be called. 
    \\ call them both here. 
} 

這裏我取得了相同的MyThread的類,你可以做到按你想要的對象。你可以創建兩個不同實現的線程類的對象並編寫你的運行。 在任何情況下,它都不會影響通話。

相關問題