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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

黑马程序员之单例模式学习

發布時間:2024/4/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 黑马程序员之单例模式学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

android培訓??java培訓?期待與您交流!

?

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

?

?

?

?

首先看一個經典的單例實現。

public?class?Singleton {

????private?static?Singleton?uniqueInstance?=?null;

?

????private?Singleton() {

???????// Exists only to defeat instantiation.

??? }

?

????public?static?Singleton getInstance() {

???????if?(uniqueInstance?==?null) {

???????????uniqueInstance?=?new?Singleton();

?????? }

???????return?uniqueInstance;

??? }

????// Other methods...

}

Singleton通過將構造方法限定為private避免了類在外部被實例化,在同一個虛擬機范圍內,Singleton的唯一實例只能通過getInstance()方法訪問。(事實上,通過Java反射機制是能夠實例化構造方法為private的類的,那基本上會使所有的Java單例實現失效。此問題在此處不做討論,姑且掩耳盜鈴地認為反射機制不存在。)

但是以上實現沒有考慮線程安全問題。所謂線程安全是指:如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。或者說:一個類或者程序所提供的接口對于線程來說是原子操作或者多個線程之間的切換不會導致該接口的執行結果存在二義性,也就是說我們不用考慮同步的問題。顯然以上實現并不滿足線程安全的要求,在并發環境下很可能出現多個Singleton實例。

1 public class TestStream {
2 private String name;
3 public String getName() {
4 return name;
5 }
6 public void setName(String name) {
7 this.name = name;
8 }
9 //該類只能有一個實例
10 private TestStream(){} //私有無參構造方法
11 //該類必須自行創建
12 //有2種方式
13 /*private static final TestStream ts=new TestStream();*/
14 private static TestStream ts1=null;
15 //這個類必須自動向整個系統提供這個實例對象
16 public static TestStream getTest(){
17 if(ts1==null){
18 ts1=new TestStream();
19 }
20 return ts1;
21 }
22 public void getInfo(){
23 System.out.println("output message "+name);
24 }
25 } 1 public class TestMain {
2 public static void main(String [] args){
3 TestStream s=TestStream.getTest();
4 s.setName("張孝祥");
5 System.out.println(s.getName());
6 TestStream s1=TestStream.getTest();
7 s1.setName("張孝祥");
8 System.out.println(s1.getName());
9 s.getInfo();
10 s1.getInfo();
11 if(s==s1){
12 System.out.println("創建的是同一個實例");
13 }else if(s!=s1){
14 System.out.println("創建的不是同一個實例");
15 }else{
16 System.out.println("application error");
17 }
18 }
19 }

運行結果:
  張孝祥
  張孝祥
  output message 張孝祥
  output message 張孝祥
  創建的是同一個實例

結論:由結果可以得知單例模式為一個面向對象的應用程序提供了對象惟一的訪問點,不管它實現何種功能,整個應用程序都會同享一個實例對象。

1.餓漢式單例類

1 //餓漢式單例類.在類初始化時,已經自行實例化
2 public class Singleton1 {
3 //私有的默認構造子
4 private Singleton1() {}
5 //已經自行實例化
6 private static final Singleton1 single = new Singleton1();
7 //靜態工廠方法
8 public static Singleton1 getInstance() {
9 return single;
10 }
11 }

2.懶漢式單例類

1 //懶漢式單例類.在第一次調用的時候實例化
2 public class Singleton2 {
3 //私有的默認構造子
4 private Singleton2() {}
5 //注意,這里沒有final
6 private static Singleton2 single=null;
7 //靜態工廠方法
8 public synchronized static Singleton2 getInstance() {
9 if (single == null) {
10 single = new Singleton2();
11 }
12 return single;
13 }
14 }

3.登記式單例類

1 import java.util.HashMap;
2 import java.util.Map;
3 //登記式單例類.
4 //類似Spring里面的方法,將類名注冊,下次從里面直接獲取。
5 public class Singleton3 {
6 private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
7 static{
8 Singleton3 single = new Singleton3();
9 map.put(single.getClass().getName(), single);
10 }
11 //保護的默認構造子
12 protected Singleton3(){}
13 //靜態工廠方法,返還此類惟一的實例
14 public static Singleton3 getInstance(String name) {
15 if(name == null) {
16 name = Singleton3.class.getName();
17 System.out.println("name == null"+"--->name="+name);
18 }
19 if(map.get(name) == null) {
20 try {
21 map.put(name, (Singleton3) Class.forName(name).newInstance());
22 } catch (InstantiationException e) {
23 e.printStackTrace();
24 } catch (IllegalAccessException e) {
25 e.printStackTrace();
26 } catch (ClassNotFoundException e) {
27 e.printStackTrace();
28 }
29 }
30 return map.get(name);
31 }
32 //一個示意性的商業方法
33 public String about() {
34 return "Hello, I am RegSingleton.";
35 }
36 public static void main(String[] args) {
37 Singleton3 single3 = Singleton3.getInstance(null);
38 System.out.println(single3.about());
39 }
40 }

轉載于:https://www.cnblogs.com/lzf8888/p/3844672.html

總結

以上是生活随笔為你收集整理的黑马程序员之单例模式学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。