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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式 单例模式解决线程安全问题

發(fā)布時間:2023/12/10 asp.net 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式 单例模式解决线程安全问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

一 實驗

1.1 餓漢式多線程觀察

?1.2 懶漢式多線程觀察

二?單例模式解決線程安全問題

2.1 Holder的方式解決單例模式線程安全問題


一 實驗

首先我們看一下單例模式的餓漢式多線程懶漢式多線程?getInstance()獲取的實例是否是同一個

關(guān)于單例模式的基礎(chǔ)使用請點這里

關(guān)于多線程實現(xiàn)的方式請看這里

現(xiàn)在開始

1.1 餓漢式多線程觀察

package singletonMode;public class SingletonHungry {private static SingletonHungry singletonHungry = new SingletonHungry();private SingletonHungry(){System.out.println(this.getClass().getSimpleName()+"創(chuàng)建了");}public static SingletonHungry getInstance(){System.out.println("SingletonHungry getInstance");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}return singletonHungry;} } package singletonMode;public class Client {public static void main(String[] args) {System.out.println("main線程:這是單例模式");//創(chuàng)建了一個線程,獲取餓漢的實例new Thread(new Runnable() {@Overridepublic void run() {System.out.println("新線程:"+SingletonHungry.getInstance());}}).start();System.out.println("main線程:"+SingletonHungry.getInstance());} }

?結(jié)果

?1.2 懶漢式多線程觀察

package singletonMode;public class SingletonLazy {private static SingletonLazy singletonLazy = null;private SingletonLazy(){System.out.println(this.getClass().getSimpleName()+"創(chuàng)建了");}public static SingletonLazy getInstance(){System.out.println("singletonLazy getInstance");if(singletonLazy == null){try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}singletonLazy = new SingletonLazy();}return singletonLazy;} } package singletonMode;public class Client {public static void main(String[] args) {System.out.println("main線程:這是單例模式");//創(chuàng)建了一個線程,獲取餓漢的實例new Thread(new Runnable() {@Overridepublic void run() {System.out.println("新線程:"+SingletonLazy.getInstance());}}).start();System.out.println("main線程:"+SingletonLazy.getInstance());} }

?結(jié)果:

可以看到懶漢式多線程創(chuàng)建的實例并不是同一個,單例模式只能有一個實例,所以現(xiàn)在要解決這個問題

二?單例模式解決線程安全問題

我們可以用 同步方法/同步代碼塊來解決懶漢式的多線程安全問題,但始終會帶來效率問題

??

下面我們用更好地方式來實現(xiàn)?

2.1 Holder的方式解決單例模式線程安全問題

package singletonMode;/*** 最終極的單例模式的寫法*/ public class SingletonHolder {private static class SingletonInnerHolder{private static SingletonHolder instance = new SingletonHolder();}private SingletonHolder(){System.out.println("SingletonHolder 構(gòu)造函數(shù)");}public static SingletonHolder getInstance(){System.out.println("進入 SingletonHolder getInstance");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}return SingletonInnerHolder.instance;} }

測試類

package singletonMode;public class Client {public static void main(String[] args) {System.out.println("main線程:這是單例模式");//創(chuàng)建了一個線程,獲取餓漢的實例new Thread(new Runnable() {@Overridepublic void run() {System.out.println("新線程:"+SingletonHolder.getInstance());}}).start();System.out.println("main線程:"+SingletonHolder.getInstance());} }

結(jié)果

?ok了

總結(jié):
餓漢式:線程安全,但是過早浪費資源 → 多個線程 getInstance()獲取的實例是同一個
懶漢式:線程不安全,節(jié)約資源 → 不解決線程安全問題,多個線程 getInstance()獲取的實例不是同一個
?? ?解決辦法1:同步方法/同步代碼塊 → 始終會帶來效率的問題
?? ?解決辦法2:用Holder的方式創(chuàng)建一個內(nèi)部類 → OK(單例模式 用這種好,推薦)

總結(jié)

以上是生活随笔為你收集整理的设计模式 单例模式解决线程安全问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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