设计模式 单例模式解决线程安全问题
生活随笔
收集整理的這篇文章主要介紹了
设计模式 单例模式解决线程安全问题
小編覺得挺不錯的,現(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CMOS图像传感器——SmartSens
- 下一篇: 【设计模式】实现线程安全单例模式的五种方