几种常用的单例模式

浅谈单例模式

单例模式的定义
  • 单例模式是为了确保某个类只有一个实例,并且自行实例化向整个系统提供这个实例。就比如计算机的任务管理器、打印机、显卡驱动等都被设计成了单例模式。选择使用单例模式就是为了避免不一致的状态。
单例模式的特点
  • 单例类只能有一个实例对象。
  • 单例类必须自己创建一个自己的唯一实例。
  • 单例类必须给其他对象提供这一实例。
    单例模式保证了全局对象的唯一性,就比如电脑打印文件一样,同时只能向一个打印机发送请求。
线程安全问题
  • 在获取单例的时候,要保证只能产生一个实例对象
  • 使用单例对象时要猪一样单例对象内的实例变量会被多个线程共享,推荐使用无状态对象,不会因为多个线程的交替调度而破坏自身的状态导致线程安全问题。
实现单例模式的方法
  • 饿汉式
//饿汉式
public class Single {
	//私有属性,且final修饰
	private static final Single single = new Single();
	//私有化无参构造,不能new方式创建对象
	private Single() {
	}
	//提供公共静态方法
	public static Single getSingle() {
		return single;
	}
}

  • 饿汉式单例在类加载的时候就会创建一个静态对象供外部使用,除非系统重启,这个对象时不会改变的,所以线程本身是安全的。

  • 懒汉式
public class Single1 {
	//提供私有属性
	private static Single1 single1 =null;
	//私有化无参构造,不能new方式创建对象
	private Single1() {
	}
	//提供公共静态方法
	public static Single1 getSingle() {
		if (single1==null) {
			single1 = new Single1();
		}
		return single1;
	}
}

  • 懒汉式虽然使用延迟创建实例对象的方式,但在多线程情况下会创建对个实例对象,所以说在多线程下是不安全的。
  • 使用sunchronized加上同步锁,就可以解决多线程的问题
public class Single1 {
	//提供私有属性
	private static Single1 single1 =null;
	//私有化无参构造,不能new方式创建对象
	private Single1() {
	}
	//提供公共静态方法;使用synchronize解决多线程不安全问题
	public synchronized static Single1 getSingle() {
		if (single1==null) {
			single1 = new Single1();
		}
		return single1;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值