java線程的幾種狀態(tài) 多個線程可以讀一個變量,只有一個線程可以對這個變量進(jìn)行寫,到底要不要加鎖?
多個線程可以讀一個變量,只有一個線程可以對這個變量進(jìn)行寫,到底要不要加鎖?下面簡要解釋一下原因:鎖定是因為操作不是原子的。讓我們用操作一來解釋它。看下面兩個圖。我這個操作需要看上面的第二個圖,你能很清
多個線程可以讀一個變量,只有一個線程可以對這個變量進(jìn)行寫,到底要不要加鎖?
下面簡要解釋一下原因:
鎖定是因為操作不是原子的。讓我們用操作一來解釋它??聪旅鎯蓚€圖。
我這個操作需要
看上面的第二個圖,你能很清楚地理解這個過程嗎?
鎖定是為了確保上述三個步驟是原子操作。
回到問題上來,只有一個線程要寫,沒有競爭,所以不需要鎖定。
但是,如果你看第一張圖片,因為主內(nèi)存和本地內(nèi)存的存在
在一個線程寫入后,其他線程無法立即看到它。這就是可見性問題。
添加volatile關(guān)鍵字后,它將在操作后強制工作內(nèi)存和主內(nèi)存同步,以確保其他線程可以立即看到它。
下面對sleep()和wait()的描述哪個是正確的?
對于sleep()和wait(),錯誤如下:(1)A.sleep是thread類的方法,wait是object類的方法;(2)B.sleep不釋放object鎖,wait放棄object鎖;(3)C.sleep暫停線程,但仍然保持監(jiān)視狀態(tài),之后會自動恢復(fù)結(jié)束;(4)d等待后,進(jìn)入等待鎖池。只有在向?qū)ο蟀l(fā)出notify方法之后,它才能獲得對象鎖并進(jìn)入運行狀態(tài)。答:dsleep是thread類的一個方法,它使線程在指定的時間內(nèi)暫停執(zhí)行,給其他線程執(zhí)行的機會,但監(jiān)視狀態(tài)保持不變,并在該時間后自動恢復(fù)。調(diào)用sleep不會釋放對象鎖。Wait是object類的一個方法。對此對象調(diào)用wait方法會導(dǎo)致線程放棄對象鎖并進(jìn)入等待此對象的等待鎖池。只有在此對象上發(fā)出notify方法(或notifyAll)后,線程才能進(jìn)入對象鎖池,準(zhǔn)備獲取對象鎖并進(jìn)入操作狀態(tài)。