package test;/** * 雙重檢查鎖實現單例類 * @author huawangxin * 2017年2月16日 下午2:28:27 * * 代碼會檢查兩次單例類是否有已存在的實例,一次加鎖一次不加鎖,一次確保不會有多個實例被創建。 * 該模型存在的問題: * 解決方案:在JDK1.5中,java修復了其內存模型的問題。volatile修飾符修飾object變量, * 能保證先行發生關系,所有的寫(write)都將先行發生于讀(read)。在JDK1.5之前,這種方法會有問題。 * */public class TestSingleton { PRivate static TestSingleton object; public static TestSingleton getInstance() { if (object == null) { synchronized (object) { if (object == null) { object = new TestSingleton(); } } } return object; }}
package test;/** * 雙重檢查鎖實現單例類【改進版】 * @author huawangxin * 2017年2月16日 下午2:28:27 * */public class TestSingleton2 { private static TestSingleton2 instance = null; private TestSingleton2() {} private static synchronized void syncInit() { if (instance == null) { instance = new TestSingleton2(); } } public static TestSingleton2 getInstance() { if (instance == null) { syncInit(); } return instance; }}
package test;/** * 枚舉實現單例類【改進二版】 * @author huawangxin * 2017年2月16日 下午2:28:27 * 該方式為目前最好的原因:1.線程安全 2.不會因為序列化而產生新實例 3.防止反射攻擊 * */public enum Work { INSTANCE; public TestSingleton singleWrite() { return new TestSingleton(); }
private Object readResolve(){ return INSTANCE; }}public class Test{ public static void main(String[] args) { TestSingleton write = Work.INSTANCE.singleWrite(); }}
新聞熱點
疑難解答