java基础10 单例模式之饿汉式和懒汉式单例

前言: 软件行业中有23中设计模式

    单例模式
    模版模式
    装饰者模式
    观察者模式
    工厂模式
    ...........

单例模式

1. 单例模式包括

  1.1 饿汉式单例
  1.2 懒汉式单例

2. 概念

 单例模式: 保证一个类中存在唯一的一个对象
       模式: 模式就是解决某类问题的固定步骤

3. 单例模式步骤

      1.私有化构造器    
      2.声明本类中的引用类型变量,并且使该变量指向本类对象
      3.提供一个公共的静态的方法获取该类的对象

4. 饿汉式单例(步骤)

    1.私有化构造器
    2.声明本类中引用类型变量,并且使该变量指向本类对象
    3.提供一个公共的静态方法获取本类中的对象

5. 懒汉式单例(步骤)

    1.私有化构造器
    2.声明本类中引用类型变量
    3.提供一个公共的静态方法获取本类中的对象,获取之前先判断是否已经创建本类中的对象,如果创建了,那么直接返回对象即可,如果没有创建,先创建本类中的对象,然后在返回.

6.数据类型

 数据类型包括: 1. 基本数据类型;2. 引用数据类型

 6.1 基本数据类型:除了基本数据类型(四类八种),其他的都是引用类型.

 6.2 引用类型:数组、类、接口、抽象(类)等等。

7. 举例

 1 //饿汉式单例       //线程安全的
 2 class Single{
 3     private String name;
 4     //声明本类的引用类型变量,并且该变量指向本类对象
 5     private static Single sing = new Single();
 6     
 7     public void setName(String name){
 8         this.name = name;
 9     }
10     public String getName(){
11         return name;
12     }
13     //私有化构造器
14      private Single(){
15     
16     }
17     //提供一个公共的静态方法,用于获取本类中的对象
18     public static Single getInstance(){
19         return sing;
20     }
21 }
22 
23 //懒汉式单例     //线程不安全. 需要双重判断+使用同步方法,线程才安全.
24 class Single2{
25     private String name;
26     //声明本类的引用类型变量
27     private static Single2 single;
28         
29     public void setName(String name){
30         this.name = name;
31     }
32     public String getName(){
33         return name;
34     }
35     //私有化构造器
36     private Single2(){
37         
38     }
39     //提供一个公共的静态方法,用于获取本类中的对象
40     public static Single2 getInstance(){//synchronized(): 同步方法.  由于懒汉式单例线程不安全,所以才要使用同步方法和双重判断,才能保证线程安全
41         if(single == null){//可能同时存在多个线程进来(假如s2和s3同时进来)
42             /*第一个线程进来后,该方法被锁定,等第一个线程处理完并出来后(此时single有值了,所以第三个以后的进程不会走这步了),第二个进程才能进来.
43              *由于上一步是两个进程同时进来的,所以还会继续往下执行,进入同步方法.但是,由于上面进来的是两个不同的进程,那么会改变single的值,出现线程不安全的情况,所以同步方法中还要加一步判断
44              */
45             //synchronized(class):如果不同线程监视同一个实例或者不同的实例对象,都会等待.
46             synchronized(Single2.class){//Single2.class:监视器,监视Single2这个对象[指Single2 single = new Single2()]. 
47                 if(single == null){//此步,第二个进程不会再进来了,因为第一个进程进来后single已经有相对应的值,不再是NULL. 双重判断保证线程的安全
48                     single = new Single2();
49                 }
50             }
51         }
52         return single;
53     }
54 }
55 
56 class Demo7 {
57     public static void main(String[] args) {
58         //测试饿汉式单例
59         Single s = Single.getInstance();    
60         Single s1 = Single.getInstance();
61         s.setName("狗娃");
62         s1.setName("狗剩");
63         System.out.println(s.getName());
64         System.out.println(s1.getName());
65         
66         //下面是测试懒汉式单例
67         Single2 s2 = Single2.getInstance();    
68         Single2 s3 = Single2.getInstance();
69         s2.setName("张三");
70         s3.setName("李四");
71         System.out.println(s2.getName()+"==========");
72         System.out.println(s3.getName()+"==========");
73     }
74 }

结果图:

 说明:  单例模式,保证一个类中只存在唯一的一个对象

8. 同步方法中的 "监视器"

    synchronized(this) 与 synchronized(class) 相关知识: https://www.cnblogs.com/highriver/archive/2011/12/18/2291965.html

 

 

 

 

原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:http://www.cnblogs.com/dshore123/p/8794288.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

posted @ 2018-04-11 10:45  DSHORE  阅读(326)  评论(0编辑  收藏  举报