java可以做什么 多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?
多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?先說結(jié)論:不必要如果不需要可見性,什么都不需要加如果需要保證可見性,則需要加volatile關(guān)鍵字。這里可以加鎖,但是沒必要,
多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?
先說結(jié)論:不必要
- 如果不需要可見性,什么都不需要加
- 如果需要保證可見性,則需要加volatile關(guān)鍵字。這里可以加鎖,但是沒必要,對性能有影響
下面簡單解釋下原因:
加鎖是因為操作不是原子性的,以i 這個操作來解釋,看下面兩張圖。
i 這個操作需要
- 先將i的值從內(nèi)存中讀出來
- 然后加1
- 最后寫回去
看上面第二張圖,能很清楚的理解流程吧?
加鎖就是保證上面的三步是一個原子操作。
回到問題,這里只有一個線程寫,實際沒有競爭,所以沒必要加鎖。
但是,看第一張圖,因為有主內(nèi)存和本地內(nèi)存的存在
- 線程先寫入本地內(nèi)存
- 然后刷入主內(nèi)存
- 其它內(nèi)存同步主內(nèi)存到工作內(nèi)存
- 然后從工作內(nèi)存中讀取
一個線程寫入后,不能保證其它線程立即看到,這就是可見性問題。
加了volatile關(guān)鍵字后,會強制操作后同步工作內(nèi)存和主內(nèi)存,保證其它線程立刻看到。
在學(xué)JAVA的時候?qū)o,多線程一知半解,是繼續(xù)往后學(xué)到做項目的時候弄明白呢還是剛開始就要弄懂它們?
多線程在java中比較普遍的問題,也是較難理解的部分。
現(xiàn)在可以學(xué)習(xí)多線程,多線程的內(nèi)容比較多,有的也涉及到底層?,F(xiàn)在可以學(xué)學(xué)試著理解,有一知半解的時候可以試試找找資料,也可以先記錄下來,后面慢慢理解。內(nèi)容較多,等項目運用到的時候,再學(xué)習(xí),可能不知從哪里做起,到時候又花費較多的時間。
總之,學(xué)習(xí)還是循序漸進,一步步的理解。