只有一個線程可以對這個變量進行寫?
先說結論:不必要
如果不需要可見性,什么都不需要加如果需要保證可見性,則需要加volatile關鍵字。這里可以加鎖,但是沒必要,對性能有影響下面簡單解釋下原因:
加鎖是因為操作不是原子性的,以i++這個操作來解釋,看下面兩張圖。
i++這個操作需要
先將i的值從內存中讀出來然后加1最后寫回去看上面第二張圖,能很清楚的理解流程吧?
加鎖就是保證上面的三步是一個原子操作。
回到問題,這里只有一個線程寫,實際沒有競爭,所以沒必要加鎖。
但是,看第一張圖,因為有主內存和本地內存的存在
線程先寫入本地內存然后刷入主內存其它內存同步主內存到工作內存然后從工作內存中讀取一個線程寫入后,不能保證其它線程立即看到,這就是可見性問題。
加了volatile關鍵字后,會強制操作后同步工作內存和主內存,保證其它線程立刻看到。