博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式系列之单例模式
阅读量:6035 次
发布时间:2019-06-20

本文共 2126 字,大约阅读时间需要 7 分钟。

 

 

单例模式的定义

一个类有且仅有一个实例,并且自行实例化向整个系统提供。比如,多程序读取一个配置文件时,建议配置文件时,建议配置文件封装成对象。会方便操作其中的数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的。

 

单例模式的作用

 

简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。

单例模式的类图

                                                         

如何保证对象的唯一性

思想:(1)不让其他程序创建该类对象;

   (2)在本类中创建一个本类对象;

    (3)对外提供方法,让其他程序获取这个对象;

步骤:(1)因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序就无法再创建该类的对象;

   (2)就在类中创建一个本类的对象;

    (3)定义一个方法,返回该对象,让其他程序可以通过方法得到本类的对象(作用:可控,本类对象的产生由自己来决定,别谁想new就new)

 

【温情提示】:我们如果把代码写成这样,用户端获取到getInstance方法不是也可以获取很多的类对象吗?这不就不是单例了吗?

1 public class Car {2 3     private Car(){4         5     }6     public static  Car getInstance(){7         return new Car();8     }9 }

 

所以我们直接自己在类中自己创建一个对象,getInstance方法只负责把对象返回给调用者,完全实现单例可控(你能获取我的方法,但是能拿到的是我自己创建好的对象)

1 public class Car { 2  3     private static Car car=new Car(); 4     private Car(){ 5          6     } 7     public static  Car getInstance(){ 8         return car; 9     }10 }

代码体现:

   (1)私有化构造函数

    (2)创建私有并静态的本类的对象

   (3)定义公有并静态的方法,返回该对象;

代码实现主要有两种方式:饿汉模式和懒汉模式

饿汉模式:类加载的时候对象就已经存在,饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变。为啥是线程安全的呢?我们后面会给出解释

 

1 public class Single { 2  3     private static Single s=new Single(); 4     private Single(){ 5          6     } 7     public static Single getInstance(){ 8         return s; 9     }10 }

 

懒汉模式:类加载的时候对象还不存在,就是所谓的延迟加载方式,需要时再进行创建,懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的(有点不懂?不要紧,后面会明白的,先上代码)

1 public class Single { 2  3     private static Single single = null; 4  5     private Single() { 6  7     } 8  9     public static Single getInstance() {10         if (single == null) {11             single = new Single();12         }13         return single;14     }15 }

下面我们解释一下,懒汉式的线程不安全性,通常情况下,我们建议写饿汉式,因为是线程安全的。

当多线程访问懒汉式时,因为懒汉式的方法内对共性数据进行多条语句的操作。

 

两个线程,线程一和线程二同时调用了getInstance方法,当线程1执行了if判断,single为空,还没来得及执行single =new Single()创建对象,这个时候线程2就来了,它也进行if判断,single依然为空,则创建Single对象,此时,两个线程就会创建两个对象,违背我们单例模式的初衷,如何解决呢?

出现线程安全的问题,为了解决这种问题,加入同步机制(不熟悉同步机制的请自行百度吧):静态同步函数的锁是类的字节码文件对象

  

             

 

好,到这里,就真正的把单例模式介绍完了,在此呢再总结一下单例类需要注意的几点:

 

一、单例模式是用来实现在整个程序中只有一个实例的。

 

二、单例类的构造函数必须为私有,同时单例类必须提供一个全局访问点。

 

三、单例模式在多线程下的同步问题和性能问题的解决。

 

四、懒汉式和饿汉式单例类。

转载于:https://www.cnblogs.com/java2016/p/5386589.html

你可能感兴趣的文章
oracle recyclebin与flashback drop
查看>>
svmlight使用说明
查看>>
Swing 和AWT之间的关系
查看>>
Mysql设置自增长主键的初始值
查看>>
Android计时器正确应用方式解析
查看>>
获取post传输参数
查看>>
ASP生成静态页面的方法
查看>>
mysql 权限
查看>>
HDU 1325 Is It A Tree? 判断是否为一棵树
查看>>
Shell命令-文件压缩解压缩之gzip、zip
查看>>
个人总结
查看>>
uva 673 Parentheses Balance
查看>>
Bzoj 2252: [2010Beijing wc]矩阵距离 广搜
查看>>
css 禁止选中文本
查看>>
bzoj2165
查看>>
tomcat 配置首页
查看>>
算术运算表达式正则及分析
查看>>
Oracle 12c 多租户 手工创建 pdb 与 手工删除 pdb
查看>>
shell初涉
查看>>
[浪子学编程][MS Enterprise Library]ObjectBuilder之创建策略祥解(二)
查看>>