package com.zzfl.pm1;物件在虛擬機器中例項化的時候對多執行緒可能產生的影響:/** * zzfl 2019/8/11
*/public class singleton }}
/*volatile:不穩定的,易揮發的。
*/private static volatile singleton instance;
public static singleton getinstance()}}
return instance;
}}class demo
};new thread(runnable, "視窗1").start();
new thread(runnable, "視窗2").start();
new thread(runnable, "視窗3").start();
new thread(runnable, "視窗4").start();}}
正常情況下,在建立乙個例項化物件的時候,①首先是在堆中開闢空間,②然後呼叫構造方法對屬性進行初始化,③最後把例項化物件位址賦值給棧空間中的變數。但是實際上在volatile作用:jvm執行的過程中有可能會對**進行優化,優化成①③②。假如有乙個執行緒
a在進行例項化乙個物件的過程中,被優化成①③②,但是當執行到步驟三的時候
a執行緒的
cpu此時到期,那麼執行緒
b在對該獲取物件的時候,此時該物件時候通過判斷發現該物件已經被例項化過了因為棧空間當中已經存有例項化物件的位址,但是由於
a執行緒並沒有對例項化物件屬性進行初始化,因此在
b執行緒獲取該例項化物件的屬性的時候有可能造成空指標異常。因此,如果對共享資源屬性加上volatile修飾詞進行修飾,那麼就會告訴虛擬機器不要對該例項化物件進行優化,而這個優化的過程就叫做
指令重排序。
1)保證執行緒可見性
2)禁止指令重排序
解決單例設計模式中懶漢式執行緒安全問題
首先寫個單例 public class singledemo public static singledemo getinstance return s 寫個測試類 public class threaddemo3 執行結果一直都是true,說明單執行緒下是沒問題的,下面寫個多執行緒來訪問單例 pu...
idea多執行緒除錯懶漢式單例執行緒安全問題
四.結果 懶漢式單例如果沒有加鎖時,會產生執行緒安全問題。如下 public class lazysingleton public static lazysingleton instance null public static lazysingleton getinstance return in...
懶漢式模式的執行緒安全問題
新建乙個單例模式類和乙個多執行緒測試類 public class test24 implements runnable public static void main string args class testsingleton public static testsingleton getins...