亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

黑馬程序員——單例模式專集細節講述

2019-11-14 15:09:58
字體:
來源:轉載
供稿:網友

----<a target="blank">java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------

本篇博客對單例模式的餓漢式、懶漢式應用在多線程下是否存在安全隱患及其解決方法進行細節講述。

單例模式

定義:確保一個類只有一個實例,而且自行實例化并向整個系統提供這個實例。

類型: 創建類模式

  單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易于外界訪

,從而方便對實例個數的控制并節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。

要點:主要有三個,一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。

注意如何保證對象的唯一性?

  • 不允許其他程序用new創建該類對象。
  • 在該類中創建一個本類實例。
  • 對外提供一個方法讓其它程序可以獲得該類對象。

單例的步驟

  • 私有化該類構造函數
  • 通過new在本類中創建一個本類對象
  • 定義一個公有方法

 

單例模式中的餓漢式(又叫單例設計模式)、懶漢式(又叫延遲加載設計模式)。

 1 //餓漢式(開發時常用) 2 class Single{//類一加載,對象就已經存在了 3 PRivate static final Single S= new Single(); 4 private Single();//私有化該類的構造函數,這樣其它類就不能夠再用new方式創建對象了。 5 public static Single getInstance(){ 6     return S;//返回一個本類對象,因為該方法是靜態的,靜態的方法訪問的只能是靜態的S,所以Single S = new Single()必須是靜態的。 7    } 8 } 9 10 class SingleDemo{11     public static void main(String[] args){12         Single ss = Single.getInstance();//因為Single類的構造函數已經private(私有化了),所以此處只能用 類名.函數名 調用getInstance方法。13         //但是類名調用有前提:必須是靜態的方法.所以getInstance是靜態方法,要有static修飾,14         //而該方法中返回一個已經創建好的對象ss,保證只有一個對象.15     }16 }

 

 1 //懶漢式(延遲加載形式)(面試常被問到) 2 class Single{//類一加載,只是先創建引用,只有調用了getInstance方法,才會創建對象 3 private static Single S = null; 4 private Single(); 5 public static Single getInstance(){ 6   if(S==null){ 7     S = new Single(); 8     return S; 9           }10     }11 }12 //如果后期被多線程并發訪問時,保證不了對象的唯一性,存在安全隱患,如果改后,效率降低13 class SingleDemo{14     public static void main(String[] args){15         Single ss = Single.getInstance();16     }17 }

 

問題1.  分析兩者在多線程并發訪問情況下存在的安全隱患?

  說到這里討論多線程并發訪問下存在的安全隱患,就必須要了解一下,線程安全問題產生的原因是什么?

  • 多個線程在操作共享的數據。
  • 操作共享數據的線程代碼有多行

  當一個線程在執行操作共享數據的多行代碼過程中,其它線程參與了運算就會導致線程安全問題的產生。

  解決思路:就是將多條操作共享數據的代碼封裝起來,當有線程在執行這些代碼的時候,其他線程不可參與運算。必須要當前線程把這些代碼都執行完畢后,其他線程不可參與運算。

 ?。?)在Java中,用同步代碼塊就可以解決這個問題

    同步代碼塊格式:    synchronized(對象){
                需要被同步的代碼塊
              }

    同步的前提:同步中必須有多個線程并使用同一把鎖

    同步的好處:解決了線程的安全問題

    同步的弊端:會相應降低效率,因為線程外的其它線程都會判斷同步鎖。

 ?。?)同步函數也可以解決問題:將synchronized放到方法中修飾

 ?。?)同步函數與同步代碼塊的區別?

      同步函數使用的鎖是固定的this。同步代碼塊使用的鎖是任意的對象(建議使用)

 ?。?)靜態的同步函數使用的瑣是:該函數所屬字節碼文件對象,可用當前 類名.class 表示。

對于安全隱患分析:

   在餓漢式中(不存在安全隱患),當遇到多線程并發訪問時,getInstance加載到線程的run()方法中,返回的對象S是共享數據,因為操作共享數據的代碼只有一句,所以不會涉及到線程安全問題。

   在懶漢式中(存在安全隱患),共享數據是S,且操作共享數據的代碼有多條,當其中一個線程A在執行期間,執行到S=new Single();前(即執行完if(S==null),但還沒有執行S=new Single()時 ),突然被切換執行權,導致下一條線程B開始執行,一直到線程B創建完對象S后,線程A重新獲得執行權,此時線程A又會再次執行S=new Single();再次創建對象,這樣線程A、線程B各自創建了一個對象,導致對象不唯一,也就不能是單例了!

2.  存在的安全隱患如何解決?

  (1)首先解決懶漢式中多線程并發訪問時存在的對象不唯一的安全隱患?。丛趃etInstance()方法上用synchronized修飾)

 1 //懶漢式(延遲加載形式)(面試常被問到) 2 class Single{//類一加載,只是先創建引用,只有調用了getInstance方法,才會創建對象 3 private static Single S = null; 4 private Single(); 5 public static synchronized Single getInstance(){ 6     if(S==null){ 7      S = new Single(); 8      return S; 9          }10    }11 }12 13 class SingleDemo{14     public static void main(String[] args){15         Single ss = Single.getInstance();16     }17 }

 ?。?)問題2. 問題又來了,因為使用同步函數,雖然解決了安全隱患,但是同樣的降低了效率。那么是什么原因導致多線程并發訪問的效率降低了呢?

  分析:因為第一次創建完對象后,之后的線程每一次獲取對象都要先判斷同步鎖,因此導致效率降低。

問題3.  懶漢式在線程安全前提下如何提高效率?

  解決思路:不用同步函數中的同步,改用同步代碼塊中的同步,上代碼

 1 //懶漢式(延遲加載形式)(面試常被問到) 2 class Single{//類一加載,只是先創建引用,只有調用了getInstance方法,才會創建對象 3 private static Single S = null; 4 private Single(); 5 public static Single getInstance(){ 6     if(S==null){//此處多加了一次判斷 7         synchronized(Single.class){//使用同步代碼塊,此處注意使用Single.class鎖,因為getInstance()是靜態方法,所以只能用Single.class .而this.getClass()鎖是用于非靜態的方法。 8             if(S==null){ 9              S = new Single();10             }11        }12      return S;13     }14    }15 }16 17 class SingleDemo{18     public static void main(String[] args){19         Single ss = Single.getInstance();20     }21 }

  上述代碼中,多加了一次判斷是為了解決效率問題,這樣當線程A創建完對象后,線程B在運行時首先判斷S==null,此時因為線程A已經創建完對象,所以線程B就不在執行創建對象操作。使用同步鎖是為了解決安全問題。(以上都是以程序中只有線程A、線程B來解釋的,再多線程原理也是一樣的)

 

結論:所以說真正程序開發時,多數用的是餓漢式;懶漢式當多線程并發訪問時,保證不了對象的唯一性(多線程切換執行權執行程序,導致對象不唯一),雖經過修改保證安全,但是其效率相應降低。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲欧美日韩在线不卡| 91精品综合视频| 91老司机精品视频| 尤物九九久久国产精品的分类| 久久精品人人爽| 久久久久久伊人| 操日韩av在线电影| 情事1991在线| 神马国产精品影院av| 欧美区在线播放| 国产中文欧美精品| 欧美激情一级欧美精品| 97精品视频在线播放| 中文字幕日韩欧美| 亚洲大胆人体在线| 日本一区二区三区在线播放| www.国产精品一二区| 日韩精品视频在线| 成人网在线免费观看| 日韩av中文字幕在线| 91免费视频网站| 久久久久久久久中文字幕| 亚洲开心激情网| 国产亚洲成av人片在线观看桃| 97久久伊人激情网| 欧美日韩中文字幕| 国产成人精品日本亚洲专区61| 欧美激情视频播放| 欧洲亚洲免费视频| 国产精品日韩欧美综合| 国产丝袜一区二区三区| 亚洲精品理论电影| 国产精品网址在线| 精品激情国产视频| 亚洲欧美日韩在线一区| 欧美精品做受xxx性少妇| 欧美精品xxx| 亚洲精品一区二区三区婷婷月| 国产精品极品美女在线观看免费| 91精品国产高清| 亚洲另类xxxx| 美日韩精品视频免费看| 大桥未久av一区二区三区| 欧美精品免费在线| 欧美疯狂性受xxxxx另类| 欧美一区深夜视频| 九九热这里只有精品免费看| 黄色精品一区二区| 亚洲欧洲免费视频| 中文日韩在线视频| 欧美性生交xxxxx久久久| 国产成人精品一区| 亚洲国产精品久久精品怡红院| 亚洲精品国产品国语在线| 欧美性生交大片免费| 亚洲成人动漫在线播放| 精品久久久久久久久久ntr影视| 欧美极品美女视频网站在线观看免费| 国产精品白丝av嫩草影院| 日av在线播放中文不卡| 午夜精品视频网站| 亚洲国产另类久久精品| 国产精品久久久久7777婷婷| 国产一级揄自揄精品视频| 国产精品网红直播| 欧美极度另类性三渗透| 欧美国产日韩一区二区三区| 热久久99这里有精品| 欧美激情国产日韩精品一区18| xvideos成人免费中文版| 亚洲加勒比久久88色综合| 91亚洲国产成人久久精品网站| 亚洲免费视频一区二区| 亚洲精品一二区| 中文字幕一区日韩电影| 亚洲精品天天看| 亚洲精品按摩视频| 日韩av在线免费看| 国产精品九九久久久久久久| 91精品国产色综合久久不卡98| 国产精品草莓在线免费观看| 一级做a爰片久久毛片美女图片| 美女扒开尿口让男人操亚洲视频网站| 美女久久久久久久| 欧美精品手机在线| 在线观看久久久久久| 亚洲欧洲黄色网| 日本不卡免费高清视频| 国产精品爽爽ⅴa在线观看| 亚洲欧美日韩国产成人| 国产精品久久久久久中文字| 欧美丰满老妇厨房牲生活| 精品亚洲一区二区三区四区五区| 国产日韩欧美视频在线| 国产日韩在线一区| 在线播放国产一区中文字幕剧情欧美| 亚洲欧美中文日韩在线| 亚洲成人久久电影| 色999日韩欧美国产| 高清亚洲成在人网站天堂| 午夜欧美不卡精品aaaaa| 精品少妇一区二区30p| 欧美日韩激情小视频| 久久亚洲精品小早川怜子66| 久久精品亚洲94久久精品| 欧美性xxxxx极品| 亚洲综合第一页| 98精品在线视频| 91免费版网站入口| 欧美理论电影在线播放| 亚洲精品久久久久久久久久久久| 亚洲成人xxx| 亚洲人成电影在线播放| 国产精品444| 成人美女av在线直播| 日韩亚洲欧美中文高清在线| 国产伊人精品在线| 欧美一区二区三区免费观看| 久久久国产一区二区三区| 亚洲qvod图片区电影| 欧美性xxxxhd| 亚洲无限乱码一二三四麻| 午夜精品免费视频| 欧美大片免费观看在线观看网站推荐| 亚洲乱码国产乱码精品精天堂| 久久人人97超碰精品888| 欧美成人全部免费| 久国内精品在线| 国产美女主播一区| 亚洲第一视频在线观看| 国产精品久久久久久超碰| 欧美日韩免费在线观看| 亚洲精品97久久| 国产最新精品视频| 2019中文字幕在线免费观看| 欧美日韩精品在线观看| 欧美理论电影网| 亚洲国产高清福利视频| 亚洲影院污污.| 日韩在线观看免费网站| 国产在线日韩在线| 91免费视频国产| 久久久在线观看| 夜色77av精品影院| 成人免费看片视频| 国产精品爱久久久久久久| 国产精品嫩草影院久久久| 91精品久久久久久久久久入口| 中文字幕亚洲欧美日韩高清| 亚洲视频在线免费看| 亚洲视频日韩精品| 国产精品三级在线| 狠狠爱在线视频一区| 亚洲性生活视频| 国产精品嫩草影院一区二区| 精品国产91久久久久久| 国产成人啪精品视频免费网| 欧美精品免费在线观看| 久久久久久久久久久久久久久久久久av| 国产精品久久久av久久久| 中日韩美女免费视频网站在线观看| 成人一区二区电影| …久久精品99久久香蕉国产| 久久91亚洲精品中文字幕奶水|