設計模式學習(三)——單例模式

  在Java開發過程中,很多場景下都會碰到或要用到單例模式,在設計模式里也是經常作為指導學習的熱門模式之一,相信每位開發童鞋都用到過。我們總是沿著前輩的足跡去做設定好的思路,往往沒去探究為何這么做,所以這篇文章對單例模式做了詳解。

一、單例模式定義:

  單例模式確保某個類只有一個實例,而且自行實例化并向整個系統提供這個實例。在計算機系統中,線程池、緩存、日志對象、對話框、打印機、顯卡的驅動程序對象常被設計成單例。這些應用都或多或少具有資源管理器的功能。每臺計算機可以有若干個打印機,但只能有一個Printer Spooler,以避免兩個打印作業同時輸出到打印機中。每臺計算機可以有若干通信端口,系統應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用。總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。

二、單例模式特點:
  1、單例類只能有一個實例。
  2、單例類必須自己創建自己的唯一實例。
  3、單例類必須給所有其他對象提供這一實例。

單例模式保證了全局對象的唯一性,比如系統啟動讀取配置文件就需要單例保證配置的一致性。

三、線程安全的問題

  一方面在獲取單例的時候,要保證不能產生多個實例對象,后面會詳細講到五種實現方式;

  另一方面,在使用單例對象的時候,要注意單例對象內的實例變量是會被多線程共享的,推薦使用無狀態的對象,不會因為多個線程的交替調度而破壞自身狀態導致線程安全問題,比如我們常用的VO,DTO等(局部變量是在用戶棧中的,而且用戶棧本身就是線程私有的內存區域,所以不存在線程安全問題)。

四、單例模式的選擇

  還記得我們最早使用的MVC框架Struts1中的action就是單例模式的,而到了Struts2就使用了多例。在Struts1里,當有多個請求訪問,每個都會分配一個新線程,在這些線程,操作的都是同一個action對象,每個用戶的數據都是不同的,而action卻只有一個。到了Struts2,?action對象為每一個請求產生一個實例,并不會帶來線程安全問題(實際上servlet容器給每個請求產生許多可丟棄的對象,但是并沒有影響到性能和垃圾回收問題,有時間會做下研究)。

五、實現單例模式的方法

1.餓漢式單例(立即加載方式)

/*** 餓漢式單例:餓漢式單例在單例類被加載時候,就實例化一個對象交給自己的引用* @author coco.xu* @date 2019-03-21*/
public class Singleton_1 {//在單例類被加載時候,就實例化一個對象交給自己的引用private static Singleton_1 singleton = new Singleton_1();//私有構造方法private Singleton_1(){}//靜態工廠方法public static Singleton_1 getInstance(){return singleton;}
}

?

  餓漢式單例在類加載初始化時就創建好一個靜態的對象供外部使用,除非系統重啟,這個對象不會改變,所以本身就是線程安全的。
  Singleton通過將構造方法限定為private避免了類在外部被實例化,在同一個虛擬機范圍內,Singleton的唯一實例只能通過getInstance()方法訪問。(事實上,通過Java反射機制是能夠實例化構造方法為private的類的,那基本上會使所有的Java單例實現失效。此問題在此處不做討論,姑且閉著眼就認為反射機制不存在。)

?2.懶漢式單例

/*** 懶漢式模式:懶漢式在調用取得實例方法的時候才會實例化對象* @author keke.xu* @date 2019-03-21*/
public class Singleton_2 {private static Singleton_2 singleton;//私有構造private Singleton_2(){}public static synchronized Singleton_2 getInstance(){if(singleton==null){singleton = new Singleton_2();}return singleton;}
}

?

轉載于:https://www.cnblogs.com/cocoxu1992/p/10573593.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387192.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387192.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java網絡03流

網絡程序所做的很大一部分工作只是輸入和輸出:從一個系統向另一個系統移動數據。 輸出流 Java的基本輸出流類是java.io.OutputStream: public abstract class OutputStream 這個類提供了寫入數據所需的基本方法,包括: public abstract vo…

基于微信小程序開發的仿微信demo

(本文參考自github/liujians,地址:https://github.com/liujians/weApp) 作者聲明: 基于微信小程序開發的仿微信demo 整合了ionic的樣式庫和weui的樣式庫 使用請查看使用必讀! 更新日志請點擊這里 目前功能 查看消息 網絡請求獲取數據(download示例server…

設計模式之六大原則

設計模式之設計原則 這軟件設計過程中,有六大設計原則: 單一職責原則里氏替換原則依賴倒置原則接口隔離原則迪米特法則開閉原則由于軟件開發過程中,根據業務不同等因素形成了各種復雜的而不可預料的需求,遵守原則,讓項…

安裝配置tengine

安裝tengine 1、依賴gcc openssl-devel pcre-devel zlib-devel 安裝:yum install gcc openssl-devel pcre-devel zlib-devel 2、解壓tengine壓縮包,并進入目錄; 3、./configure --prefix/usr/tengine 4、make && make install 5…

使用springboot集成jseesite

請訪問 開源中國下的https://git.oschina.net/wolfking/wolfking-jeesitehttps://www.oschina.net/p/wolfking-jeesite?fromerr6Iie3qZt 下載源碼,按照如下的運行使用 springboot 改造 jeesite,只保留最簡單的系統配置 。 介紹 1、運行主類,…

解決idea 中web項目無法正常顯示的問題

轉載于:https://www.cnblogs.com/nulijiushimeili/p/10575364.html

Hadoop小知識點

hdfs命令行 上傳 hadoop fs -put 文件名 hdfs://主機名:9000/... 下載 hadoop fs -get hdfs://主機名:9000/... 文件名 /hadoop/share/hadoop/mapreduce 文件夾下有測試程序 提交MapReduce任務命令 #hadoop jar hadoop-mapreduce-examples-2.4.1.jar pi 5 5 hadoop fs -m…

copy 擴展名 包含子文件夾 文件 到某個 文件夾

比如我在d:\fff下面有很多子文件夾,子文件夾里還有子文件夾,里面有些文件夾里有.ppm.bz2的后綴的文件,需要把他們找出來復制到d:\fff2里面,應該怎么用批處理寫?最佳答案1234echo offfor /r d:\fff %%a in (*.ppm.bz2) …

在線視頻常見加密方式及安全性透析

信息化時代,多媒體的應用日漸成為人們生活中不可或缺的部分,無論是獲取最新資訊還是教育學習,視頻都是直觀高效的媒介之一。 基于互聯網的快速傳播,眾多培訓機構也逐漸將線下原創版權課程遷移到在線平臺中,一方面可以更…

分享一個前后端分離的web項目(vue+spring boot)

Github地址:https://github.com/smallsnail-wh 前端項目名為wh-web后端項目名為wh-server項目展示地址為我的github pages(https://smallsnail-wh.github.io)用戶名:admin,密碼admin(第一次啟動會比較慢&am…

部署php項目到linux

服務器:39.106.26.67rootBayou2009 數據庫:rootbayou2009 項目文件夾路徑:/home/www/項目文件夾名稱:education.bayou-tech.cn 綁定域名:education.bayou-tech.cn 綁定域名: 用ftp把配置文件下班到windows修…

ionic最新安裝教程

公司最近開發webapp,研究了一下ionicangularjs開發。 安裝過程中碰到許多問題,發現網上有好多資料都已經過時,在這里把最新的流程記錄一下。 首先是安裝node.js,通過nodejs官網下載,沒什么問題。npm已經默認安裝&#…

ZooKeeper安裝配置

配置 1、在conf目錄下創建一個配置文件zoo.cfg tickTime2000 dataDir.../zookeeper/data dataLogDir.../zookeeper/dataLog clientPort2181 initLimit5 syncLimit2 server.1server1:2888:3888 server.2server2:2888:3888 server.3server3:2888:3888 ?tickTime&#…

1.1 算法編譯與調試

編程要保持簡單(KISS, keep it simple and stupid)。 算法競賽中的輸入輸出框架: 輸入數據保存在文件中,輸出數據也保存在文件中。 幾乎所有算法競賽的輸入數據和標準答案都是保存在文件中的。 使用文件最簡單的方法是使用輸入…

ionic2開發的仿外賣點餐系統(Ionic2+Angular2

github上的項目源碼 Run this Project(運行該項目) first(首先): make sure your computer install ionic 確保你的電腦安裝了ionic2,不懂自行百度 second(其次):$ ionic start wechat_restaurant tutorial…

Container Injection

Container的歷史: 2000 年的時候 FreeBSD 開發了一個類似于 chroot 的容器技術 Jails,這是最早期,也是功能最多的容器技術。Jails 英譯過來是監獄的意思,這個“監獄”(用沙盒更為準確)包含了文件系統、用戶…

HadoopHA集群搭建

三臺主機: 192.168.143.111 hdp1 192.168.143.112 hdp2 192.168.143.113 hdp3 1、安裝配置ZooKeeper; (1)在conf目錄下創建配置文件zoo.cfg tickTime2000 dataDir.../zookeeper/data dataLogDir.../zookeeper/dataLog clientPort2181 initLim…

node搭建服務器,寫接口,調接口,跨域

剛開始學node,今天做這個也是累死寶寶了,以后可以自己寫接口自己用了,再也不用麻煩人家后臺人員了,這些年我們欠他們的太多了,說多了都是淚,不多說,往下看吧。。。 服務端項目目錄下&#xff1a…

ThreadPoolExcutor 線程池 異常處理 (上篇)

前言 最近看到crossoverJie的一篇文章:一個線程罷工的詭異事件 首先感謝原作者的分享,自己獲益匪淺。然后是回想到自己的一次面試經歷,面試官提問了線程池中的線程出現了異常該怎樣捕獲?會導致什么樣的問題? 示例代碼 …

3 MapReduce計算模型

MapReduce被廣泛應用于日志分析、海量數據排序、在海量數據中查找特定模式等場景中。 MapReduceJob 在Hadoop中,每個MapReduce任務都被初始化為一個Job。 每個Job又可以分為兩個階段:Map階段和Reduce階段。這兩個階段分別用Map函數和Reduce函數來表示。…