2 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
所以假設(shè)我的輸出的第一行是:“Main:0”。這意味著主線程已經(jīng)獲取了名為“k”的測(cè)試對(duì)象的密鑰,對(duì)吧?我創(chuàng)建的另一個(gè)線程怎么可能在主線程完成之前進(jìn)入“inc1”方法并打印輸出?
你寫“名為'k'的測(cè)試對(duì)象”就好像只有一個(gè)一樣。在您的示例中,k
是 class 的實(shí)例變量testsyn
,因此每個(gè)實(shí)例都有自己的。它們指的是不同的對(duì)象,每個(gè)對(duì)象都有自己的監(jiān)視器。因此,執(zhí)行其中一個(gè)對(duì)象的同步實(shí)例方法的線程不會(huì)阻止另一個(gè)線程執(zhí)行另一個(gè)對(duì)象的同步實(shí)例方法。
如果我將'k'設(shè)為靜態(tài)[...],輸出之間就不會(huì)發(fā)生沖突。
是的。 static
變量屬于聲明它們的類。它們由所有實(shí)例共享。兩個(gè)線程共享一個(gè) static k
,在運(yùn)行之前已經(jīng)初始化main()
并且之后沒有被修改。由于他們都試圖運(yùn)行同一個(gè)對(duì)象的同步方法,因此必須等到另一個(gè)完成。

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
是的,synchronized
關(guān)鍵字是用來獲取鎖的;鎖與對(duì)象實(shí)例相關(guān)聯(lián)。你有兩個(gè)test
類的實(shí)例;一個(gè)給每個(gè)線程。所以沒有爭(zhēng)議。當(dāng)字段k
為靜態(tài)時(shí),線程之間共享一個(gè)實(shí)例。
添加回答
舉報(bào)