假設我在某個線程內部和塊內執行塊代碼,我調用一個方法來產生另一個線程來處理需要與第一個方法相同的鎖的同步代碼塊。因此,在僞Java代碼:Java線程和同步塊
public void someMethod() {
synchronized(lock_obj) {
// a whole bunch of stuff...
// this is the last statement in the block
(new Thread(someOtherMethod())).start();
}
// some more code that doesn't require a lock
}
public void someOtherMethod() {
// some setup code that doesn't require a lock
// return the stuff we want to run in another thread
// that does require a lock
return new Runnable() {
@Override
public void run() {
synchronized(lock_obj) {
// some more code
}
}
};
}
我不知道如何理解該代碼。我寫的甚至是合法的嗎?在句法上我沒有看到任何問題,但我不確定如何通過類似的代碼進行推理。因此,當我執行someOtherMethod()
以創建Runnable
的實例時,return語句之前的代碼在哪種範圍內運行?它是否作爲第一個同步塊的一部分執行?假設還有一些其他線程也可能需要鎖定lock_obj
。
只是添加一些可能會丟失的內容 - 調用start()後,會立即退出someMethod()中的同步塊,並且新線程並行執行。這似乎是導致OP的困惑的原因。 – 2015-07-01 22:28:20
@AbrahamPhilip - 我不會那樣說的。調用'start()'時,同步塊不會退出。 (它會在很短的時間後退出,因爲調用'start()'恰好是同步塊中的最後一條語句。)而是調用'start()'啓動另一個線程的執行(以無監視器開始持有),運行'someOtherMethod()'返回的'Runnable'中的代碼。該另一個線程需要等待'someMethod()'中的塊退出才能輸入它自己的同步塊。 – 2015-07-01 23:21:34
對不起,你是對的。讓我改述一下,「剛剛調用start()之後」。我只是想強調一下,因爲OP在懷疑第二個線程的runnable是否在第一個synchronized塊中執行(這裏的答案是錯誤地聲稱http://stackoverflow.com/a/5295252/3000919)。我相信你的評論解釋得非常好,謝謝:) – 2015-07-01 23:41:55