单例设计模式(Singleton)
来源:互联网 发布:西南交通大学网络缴费 编辑:程序博客网 时间:2024/06/09 15:23
一、设计模式:解决某一类问题最行之有效的方法
二、单例设计模式:一个类只能有一个实例(不同类中重复使用一个对象,可采用单例设计模式)
三、保证对象唯一
- 为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象——构造方法私有化(private)。
- 为了其他程序可以访问到该类对象,在本类中创建一个私有静态的本类对象(private static),设置为static是因为是类的自身属性;若不写static,则该对象就是该类对象的属性,只能通过对象访问,而我们不允许在外部创建该类的对象。
- 为了方便其他程序对该对象进行访问,提供一个静态的获取实例的方法将实例返回(public static)
四、实现步骤
//饿汉式:先初始化对象,Single类一进内存,就已经创建好了对象。(开发使用这个)class Single{ private int num; public int getNum() { return num; } public void setNum(int num) { this.num = num; } //单例 private Single() {} private static Single s = new Single(); public static Single getInstance() { return s; }}class Text { public static void main(String[] args) { //获得该实例,s1==s2 Single s1 = Single.getInstance(); Single s2 = Single.getInstance(); s1.setNum(30); System.out.println(s2.getNum()); }}//运行结果:30(s1,s2指向的是同一个对象)//使用:当需要将该事物的对象保证在内存中唯一,就使用上述方法即可,其他该怎么描述,就怎么描述。
五、单例设计模式另一种写法
//懒汉式:方法被调用时,才初始化对象,也叫做对象的延时加载class Single{ private static Single s = null; private Single() {} public static Single getInstance() { if (s == null) { s = new Single(); } return s; }}//问题://若多个线程调用getInstance(),可能1个线程判断是否为空后挂住,再执行第二个线程//判断后生成一个对象,然后又去执行第一个线程,又生成一个对象//这样可以生成n个对象,就不是想要的单例设计模式了,这就产生了安全隐患。//解决方法1:对该方法上锁(synchronized),每次只能进来一个对象,当线程较多时,每个线程都需要判断这个锁比较低效,可能造成锁等待,性能问题。public static synchronized Single getInstance() { if(s == null) { s = new Single(); } return s;} //解决方法2:锁放在里面,双检查public static Single getInstance() { if(s == null) { //第一次调用 synchronized(Single.class) {//静态方法,锁是 类名.class,因为静态没有this if(s == null) //判断在锁定期间是否被其他线程初始化了 s = new Single(); } } return s;} //多个线程运行时,A线程判断后,进入锁执行完s不再为空,B进入第一个判断条件就不符合,就不需要继续判断了,提高了一定的效率。
0 0
- 设计模式---单例模式(singleton)
- 设计模式--单例模式(Singleton)
- 设计模式--单例模式(Singleton)
- 设计模式-单例模式(Singleton)
- 【设计模式】-单例模式(Singleton)
- 设计模式---单例模式(singleton)
- 设计模式 -- 单例模式(Singleton)
- 设计模式:单例模式(Singleton)
- 设计模式:单例模式(Singleton)
- 设计模式:单例模式(Singleton)
- 设计模式:单例模式(Singleton)
- 设计模式:单例模式(Singleton)
- 设计模式-单例模式(Singleton)
- 【设计模式】单例模式(Singleton)
- 设计模式-单例(Singleton)模式
- 设计模式--单例模式(Singleton)
- 设计模式----单例模式(singleton)
- 设计模式----Singleton(单例)
- Linux 下的图形库介绍
- 【php】empty和isset的区别 总结
- LeetCode First Missing Positive
- MYSQL存储过程出现Result consisted of more than one row 错误的解决方法
- jQuery-自学笔记(1)——基础入门
- 单例设计模式(Singleton)
- 在 maven 中使用本地 jar 包
- spring部署junit 模块化测试
- 通过微信网页授权获取用户OpenId(redirect_uri 参数错误)
- Hello CSDN!
- 微信小程序搞起来!!!
- spring boot 架构问题 时间处理 (映射,时区问题)
- jsp页面中同一个超链接地址根据不同的条件而跳到不同的页面
- 几个重要的知识点网页书签