關於執行緒鎖的乙個問題

2022-03-11 02:15:14 字數 1295 閱讀 2002

public

class tt implements

runnable

public

void m2() throws exception

public

void

run()

catch

(exception e)

}public

static

void main(string args) throws

exception

}

指令碼執行結果都是2000,為什麼是這樣呢?我的理解是tt是執行緒類tt的例項化物件,相當於tt是主線程來執行,而子執行緒t是在tt的基礎上建立的乙個新的執行緒,子執行緒的建立需要時間,所以主線程tt.m2()先執行,等到tt.m2()執行第一步之後,開始休眠2500ms,這時候執行緒位置就被子執行緒t搶過去了,子執行緒t執行第一步,然後將b的值變為1000,這時候又開始休眠5000ms,這時候又切回了主線程m2,m2將b變為2000,執行第二步,然後主線程列印tt.b = 2000,主線程執行完了,切回子執行緒t,子執行緒t執行第二步,然後列印 b = 2000

開始執行m2---第一步

開始執行m1---第一步

開始執行m2---第二步

2000

開始執行m1---第二步

b = 2000

還有一種情況,就是m1和m2都加鎖,執行順序分別是主線程tt.m2()-->m2第一步-->休眠2500ms-->b = 2000-->m2第二步-->列印tt.b = 2000,然後切換回m1, m1第一步-->b = 1000 --> 休眠5000ms --> m1第二步 --> b = 1000,也就是兩個方法都加鎖,先乙個執行緒執行完,再執行另個執行緒的方法

public

class tt2 implements

runnable

public

synchronized

void m2() throws exception

public

void

run()

catch

(exception e)

}public

static

void main(string args) throws

exception

}

所以結果是

開始執行m2---第一步

開始執行m2---第二步

2000開始執行m1---第一步

開始執行m1---第二步

b = 1000

關於java執行緒的乙個問題

最近在寫乙個程式.其中就遇到了這樣乙個問題.我希望實現兩個或多個執行緒,而這些執行緒的順序是 thread thread 2,5,main a 這是執行緒2呼叫b時列印出的 thread thread 3,5,main a 這是執行緒3呼叫b時列印出的 上面的順序是我所希望的.但往往會是這樣的結果 ...

乙個關於自旋鎖 spin lock 問題的討論

前陣子有發短訊息問 在研究自旋鎖的時候,發現在 spin lock irq函式,也就是在自旋鎖中關閉中的這類函式中,既然已經關閉了本地中斷,再禁止搶占有沒有多餘。也就是說,既然本地中斷已經禁止了,在本處理器上是無法被打斷的,本地排程器也無法執行,也就不可以被本地排程程式排程出去.從spinlock設...

關於執行緒的乙個練習

下面是乙個我們學習執行緒的乙個小例子,大家看看。實現兩個執行緒,a為控制線程,b為工作執行緒,要求 1 從a中讀入乙個整數 2 根據a中讀入的數字計算其階乘,同時將結果輸入到d盤根目錄下的1.txt檔案中。該結果需要重複寫入1000次,但當使用者輸入的整數發生改變時,中斷寫入,並計算新數字的階乘,將...