已采納回答 / 慕粉4117368
是的,比如要是多線程訪問的情況下,很容易,線程一訪問到一半,線程二突然插進來執行,所以要加同步處理的機制,防止在線程一執行的情況下,有別的線程搶占進來執行,加上同步就可以使一個線程運行完了,下一個線程才可以拿到cpu的資源繼續執行
2017-04-12
并不是我想學習的那種,我想演示一下懶漢怎么出現線程不安全現象,以及如何解決線程不安全,然后單例模式還有幾種實現方式,比如說枚舉,天然的單例,還能防止反射去繞過安全機制拿到實例
2017-04-11
所謂的懶漢模式線程不安全可以簡單的理解為,在A使用這個類的實例的時候,對象正在創建的時候,B也要來使用這個實例,所以不太安全,但是,餓漢模式在類加載的時候就已經創建了對象,A和B可以同時使用這個實例。
2017-04-05
這里講的線程不安全,主要是在判斷是否創建了這個實例的代碼塊里。樓上很多贊的那個,提到的方法叫雙重檢查鎖定。
問題根源是,instance = new Instance()可以分解成三行偽代碼。正常的順序是分配對象的內存空間->初始化對象->設置instance指向剛分配的內存地址。注意第2.3步會被重排序。這時候instance被分配了內存但是沒有初始化。如果這時候有一個線程B來訪問,他判斷instance!=null后調用這個對象時發現對象沒有初始化,就出現bug了~解決方案:1、Instance聲明為volatile類型。2、允許重排序,但是重排序不被其他線程看到。
問題根源是,instance = new Instance()可以分解成三行偽代碼。正常的順序是分配對象的內存空間->初始化對象->設置instance指向剛分配的內存地址。注意第2.3步會被重排序。這時候instance被分配了內存但是沒有初始化。如果這時候有一個線程B來訪問,他判斷instance!=null后調用這個對象時發現對象沒有初始化,就出現bug了~解決方案:1、Instance聲明為volatile類型。2、允許重排序,但是重排序不被其他線程看到。
2017-03-14