12.Java设计模式入门——单例模式

所谓设计模式就是软件开发人员对于软件开发过程的一种出色的方案

单例模式

使一个类有且仅有一个实例,并且自行实例化向整个系统提供
其目的是为了让类的一个对象成为该类系统中的唯一实例

要求

  • 只能有一个实例
  • 必须自行创建实例
  • 而且得向整个系统提供这个实例,供其访问与使用

实现方法

  • 只提供私有的构造方法
  • 含有一个该类的静态私有对象
  • 提供一个静态的共有方法用于创建、获取静态私有对象

代码实现方案

饿汉式

在类中私有对象创建的过程中即可完成实例化
特征:采用空间时间,对象直接实例化在那儿,不管用还是不用,在类加载的时候,对象就已经完成了初始化,不过同时存在的周期也很长,因此更加费空间一点

package com.jachie.singleton;
/**
 * 饿汉式
 * @author 哒哒哒
 *
 */
public class SingletonOne {
	// 创建私有构造
	private SingletonOne(){	}
	// 含有一个该类的静态私有对象——创建后就初始化
	private static SingletonOne instance = new SingletonOne();
	// 提供一个静态的共有方法用于创建、获取静态私有对象
	public static SingletonOne getInstance() {
		return instance;
	}
}

懒汉式

在静态公有方法中进行实例化,只有在用的时候才会实例化
特征:采用时间空间,相比饿汉式而言,懒汉式在类加载的时候并不会去初始化对象,而是在使用的时候才会去初始化对象,如果一直不用则一直不会有空间的消耗。

package com.jachie.singleton;
/**
 * 懒汉式:实例对象不会直接初始化,直到第一次调用的时候才会初始化
 * @author 哒哒哒
 *
 */
public class SingletonTwo {
	// 创建私有构造
	private SingletonTwo(){	}
	
	// 含有一个该类的静态私有对象——创建后为空
		private static SingletonTwo instance = null;
	
		// 提供一个静态的共有方法用于创建、获取静态私有对象
		public static SingletonTwo getInstance() {
			// 判断是否为空,为空则实例化
			if(instance == null)
				instance = new SingletonTwo();
				return instance;
		}
	
}

:为什么用静态方法?
:因为对于单例模式而言,需要在类没有产生对象的情况下进行方法的调用,而实现此则需要设置static

多线程安全问题

当程序出现多线程并发执行的时候,会有多个线程同时进行操作,就是同一时刻做多件事儿,而饿汉式是在类加载的时候就对访问对象进行了创建,因此对象是唯一的,而懒汉式是在第一次调用的时候才会用到,因此容易出错,那么线程容易出错,出错在哪儿:

public class SingletonTwo {
	private SingletonTwo(){	}
		private static SingletonTwo instance = null;
		// 提供一个静态的共有方法用于创建、获取静态私有对象
		public static SingletonTwo getInstance() {
			// 判断是否为空,为空则实例化
			if(instance == null){	// 1. 
				instance = new SingletonTwo();	// 2.
			}
				return instance;
		}
}

观察上方代码,线程A在1.处交出时间片,线程A暂停,由线程B重新开始执行,当线程B执行返回singleton对象后,此时线程A继续,从暂停的地方开始,线程A将会执行2.处代码,从而没有进行空值的判断,线程A执行后将会再返回一个singleton对象
这就是线程不安全出现的问题

因此解决懒汉式线程安全的方法也有实际的解决方法

  1. 同步锁
  2. 双重校验锁
  3. 静态内部类
  4. 枚举

使用场景

  • 创建对象时占用资源过多,但又同时需要用到该类的对象
  • 对系统内资源要求统一读写,如读写配置信息
  • 当多个实例存在可能引起程序逻辑错误,如号码生成器

缺点

  • 扩展困难
  • 如果实例化以后对象长期不使用,系统将默认为垃圾进行回收,造成对象状态丢失
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空 白

停止的只会是自己,你得追逐世界

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值