static變量保證線程安全 多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?
多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?下面簡要解釋一下原因:鎖定是因為操作不是原子的。讓我們用操作一來解釋它??聪旅鎯蓚€圖。我這個操作需要看上面的第二個圖,你能很清
多個線程可以讀一個變量,只有一個線程可以對這個變量進行寫,到底要不要加鎖?
下面簡要解釋一下原因:
鎖定是因為操作不是原子的。讓我們用操作一來解釋它??聪旅鎯蓚€圖。
我這個操作需要
看上面的第二個圖,你能很清楚地理解這個過程嗎?
鎖定是為了確保上述三個步驟是原子操作。
回到問題上來,只有一個線程要寫,沒有競爭,所以不需要鎖定。
但是,如果你看第一張圖片,因為主內(nèi)存和本地內(nèi)存的存在
在一個線程寫入后,其他線程無法立即看到它。這就是可見性問題。
添加volatile關(guān)鍵字后,它將在操作后強制工作內(nèi)存和主內(nèi)存同步,以確保其他線程可以立即看到它。
Java線程安全問題指的是全局變量,還是靜態(tài)變量?
哈哈,當(dāng)你看到這個問題,你應(yīng)該有點白。全局變量和靜態(tài)變量都有線程安全問題,因為它們在堆內(nèi)存中,由所有線程共享。如果您想了解線程,請先轉(zhuǎn)到JAVA內(nèi)存模型。首先,只能靜態(tài)添加成員變量。
何時添加?
如果當(dāng)前類的任何對象需要共享此成員,將添加該對象。否則,將不添加。
JVM加載靜態(tài)成員時,加載時間比非靜態(tài)成員早。
2. 在整個JVM生命周期中,靜態(tài)成員總是只加載一次,這也是單例模式的根源。
3. 初始化靜態(tài)成員后,它將始終被類對象引用,這意味著它的地址永遠不會被GC回收。因此,建議不要定義太多。
4. 靜態(tài)成員總是將引用保存在方法區(qū)域的靜態(tài)區(qū)域中,因此引用必須由多個線程共享。因此,在編寫靜態(tài)成員時,應(yīng)特別注意線程安全。
以上是我的淺見。如果有任何誤解,請互相討論。