java - volatile 能否解決線程共享數(shù)據(jù)的安全。
問題描述
比如說我要寫一個(gè)單例模式 不用sycrynized同步方法 用volitile修飾
private Sigleton(){}
private static volitile Sigleton s = null;
public static Sigleton getInstance(){
if (s==null){ s= new Singleton(); } return s;
}
這樣能不能解決線程安全問題。
怎么理解線程可見性
如果我兩個(gè)線程同時(shí)都進(jìn)來 if s==null 最后還不是new出兩個(gè)sigleton對(duì)象嗎?
問題解答
回答1:如果new的開銷很小的話,你這樣寫完全沒問題。但如果初始化開銷很大,那還是得用 synchronized 。典型的 雙檢查鎖 是這樣寫的:
private Singleton() {}private static volitile Singleton s = null;public static Singleton getInstance() { if (s == null) {synchronized (Singleton.class) { if (s == null) {s = new Singleton(); }} } return s;}回答2:
怎么理解線程可見性
先理解內(nèi)存模型。
線程并不直接修改主內(nèi)存中的變量,而是先寫自己的工作內(nèi)存,然后再同步到主內(nèi)存中,如果還沒同步,其他的線程是看不到修改的(他們還是看到自己的工作內(nèi)存的緩存)。
相關(guān)文章:
1. javascript - sublime快鍵鍵問題2. javascript - immutable配合react提升性能?3. css - 寫頁(yè)面遇到個(gè)布局問題,求大佬們幫解答,在線等,急!~4. javascript - nodejs關(guān)于進(jìn)程間發(fā)送句柄的一點(diǎn)疑問5. Apache 已經(jīng)把網(wǎng)站根目錄的改為allow from all了,但是服務(wù)器還是不能訪問?6. 實(shí)現(xiàn)bing搜索工具urlAPI提交7. 配置Apache時(shí),添加對(duì)PHP的支持時(shí)語(yǔ)法錯(cuò)誤8. vue.js - Vue 如何像Angular.js watch 一樣監(jiān)聽數(shù)據(jù)變化9. javascript - 移動(dòng)端上不能實(shí)現(xiàn)拖拽布局嗎?10. phpstudy8.1支持win11系統(tǒng)嗎?

網(wǎng)公網(wǎng)安備