【学亮说】Java实现单例模式的8种方式(你真的搞懂单例模式了吗?)
生活随笔
收集整理的這篇文章主要介紹了
【学亮说】Java实现单例模式的8种方式(你真的搞懂单例模式了吗?)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
第一種:餓漢式單例模式?
package com.zhangxueliang.dp.sigleton;/*** 餓漢式單例模式* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午3:39:30*/ public class Zhangxueliang1 {//new一個實例private static Zhangxueliang1 instance= new Zhangxueliang1();//私有化構(gòu)造器private Zhangxueliang1(){}public static Zhangxueliang1 getInstance() {return instance;} }第二種:static代碼塊創(chuàng)建單例
package com.zhangxueliang.dp.sigleton;/*** 使用static代碼塊的方式實現(xiàn)餓漢式單例模式* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午3:35:02*/ public class Zhangxueliang2 {private static Zhangxueliang2 instance=null;private Zhangxueliang2(){}static {instance=new Zhangxueliang2();}public static Zhangxueliang2 getInstance() {return instance;}}?第三種:懶漢式單例模式
package com.zhangxueliang.dp.sigleton;/*** 懶漢式單例模式* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午3:40:34*/ public class Zhangxueliang3 {private static Zhangxueliang3 instance;private Zhangxueliang3() {}public static Zhangxueliang3 getInstance() {if (instance == null) {//SleepUtil.sleep(1);instance = new Zhangxueliang3();}return instance;}}第四種:懶漢式+synchronized同步方法
package com.zhangxueliang.dp.sigleton;/*** 懶漢式單例+synchronized同步方法* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午4:02:29*/ public class Zhangxueliang4 {private static Zhangxueliang4 instance;private Zhangxueliang4() {}public static synchronized Zhangxueliang4 getInstance() {if(instance==null) {SleepUtil.sleep(10);instance = new Zhangxueliang4();}return instance;} }第五種:懶漢式 + synchronized同步代碼塊
package com.zhangxueliang.dp.sigleton;/*** 懶漢式單例 + synchronized同步代碼塊* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午4:11:06*/ public class Zhangxueliang5 {private static Zhangxueliang5 instance;private Zhangxueliang5() {}public static Zhangxueliang5 getInstance() {if(instance==null) {SleepUtil.sleep(1);synchronized(Zhangxueliang5.class) {instance = new Zhangxueliang5();}}return instance;} }第六種:雙重檢查double check
package com.zhangxueliang.dp.sigleton;/*** 雙重檢查* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午4:25:36*/ public class Zhangxueliang6 {private static volatile Zhangxueliang6 instance;//禁止指令重排private Zhangxueliang6() {}public static Zhangxueliang6 getInstance() {if(instance==null) {SleepUtil.sleep(10);synchronized(Zhangxueliang6.class) {//雙重檢查if(instance==null) {instance = new Zhangxueliang6();}}}return instance;} }第七種:靜態(tài)內(nèi)部類方式
package com.zhangxueliang.dp.sigleton;/*** 靜態(tài)內(nèi)部類方式實現(xiàn)單例模式* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午4:29:14*/ public class Zhangxueliang7 {private Zhangxueliang7() {}private static class Zhangxueliang7Holder{private static final Zhangxueliang7 instance=new Zhangxueliang7();}public static Zhangxueliang7 getInstance() {return Zhangxueliang7Holder.instance;}}?第八種:枚舉方式創(chuàng)建單例(語法角度堪稱完美)
package com.zhangxueliang.dp.sigleton;/*** 語法上是最完美的。可以解決線程同步問題和反序列化(反射)* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午4:37:13*/ public enum Zhangxueliang8 {instance; }線程安全性測試:
package com.zhangxueliang.dp.sigleton;public class TestSigtelon {public static void main(String[] args) {//testEhanSinleton();//testStaticSingleton();//testLanhanSingleton();//testHashcode();//testSynMethod();//testSyncBlock();//testDoubleCheck();//testStaticClass();testEnum();}private static void testEnum() {for (int i = 0; i < 100; i++) {new Thread(()->{System.out.println(Zhangxueliang8.instance.hashCode());}).start();}}/*** 測試靜態(tài)內(nèi)部類創(chuàng)建單例*/private static void testStaticClass() {for (int i = 0; i < 100; i++) {new Thread(()->{System.out.println(Zhangxueliang7.getInstance().hashCode());}).start();}}/*** 測試雙重檢查*/private static void testDoubleCheck() {for (int i = 0; i < 100; i++) {new Thread(()->{System.out.println(Zhangxueliang6.getInstance().hashCode());}).start();}}/*** 懶漢式單例 + synchronized同步代碼塊*/private static void testSyncBlock() {for (int i = 0; i < 100; i++) {new Thread(()->{System.out.println(Zhangxueliang5.getInstance().hashCode());}).start();}}/*** 測試懶漢式單例+synchronized同步方法*/private static void testSynMethod() {for (int i = 0; i < 100; i++) {new Thread(()->{System.out.println(Zhangxueliang4.getInstance().hashCode());}).start();}}/*** hashCode相同,不一定是同一個對象*/private static void testHashcode() {System.out.println("通話".hashCode());//1179395System.out.println("重地".hashCode());//1179395}/*** 懶漢式單例模式 存在線程安全問題*/private static void testLanhanSingleton() {for (int i = 0; i < 100; i++) {new Thread(()->{System.out.println(Zhangxueliang3.getInstance().hashCode());}).start();}}/*** 測試static代碼塊單例模式*/private static void testStaticSingleton() {Zhangxueliang2 z1 = Zhangxueliang2.getInstance();Zhangxueliang2 z2 = Zhangxueliang2.getInstance();System.out.println(z2==z1);}/*** 測試餓漢式單例模式*/private static void testEhanSinleton() {Zhangxueliang1 z1 = Zhangxueliang1.getInstance();Zhangxueliang1 z2 = Zhangxueliang1.getInstance();System.out.println(z2==z1);}}?
總結(jié)
以上是生活随笔為你收集整理的【学亮说】Java实现单例模式的8种方式(你真的搞懂单例模式了吗?)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python3 闭包函数及nonloca
- 下一篇: Java设计模式之组合Composite