日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

【学亮说】Java实现单例模式的8种方式(你真的搞懂单例模式了吗?)

發(fā)布時間:2025/1/21 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学亮说】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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。