【深入学习设计模式】——单例模式

    

    前言

   单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,
在整个程序空间中,该类只存在一个实例对象。
   其实,GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问法。 

   为什么需要使用单例模式:

    在应用系统开发中,我们常常有以下需求:
     - 在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象
     - 在整个程序空间使用全局变量,共享资源
     - 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

   因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。

   单例模式实现

    饿汉式

public class Person {
	public static final Person person = new Person();
	private String name;
	
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	//构造函数私有化
	private Person() {
	}
	
	//提供一个全局的静态方法
	public static Person getPerson() {
		return person;
	}
}
  从上面的代码中我们可以看出来饿汉式是不会存在线程安全的,因为我们是new对象放在了最前面,但是这种做法会浪费资源。

   懒汉式

public class Person2 {
	private String name;
	private static Person2 person;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	// 构造函数私有化
	private Person2() {
	}

	// 提供一个全局的静态方法
	public static Person2 getPerson() {
		if (person == null) {
			person = new Person2();
		}
		return person;
	}
}


   上面代码看似没有什么问题,当在单线程下面中运行时没有问题,但是当出现多线程的时候就会出现并发问题,也就是当多个线程同时运行if判断时候,就会出现多个实例,有点基本功的程序员都能看懂这段代码,在这就不在废话。

  使用synchronized关键字解决并发问题

public static synchronized Person3 getPerson() {
		if(person == null) {
			person = new Person3();
		}
		return person;
	}
  这种方式虽然可以解决并发问题,但是在访问量大的时候会非常的影响性能,所以不太建议使用这种方式,因为我们只需要同步部分代码,并不是整个方法。

   双重检查机制

 

	public static Person4 getPerson() {
		if(person == null) {
			synchronized (Person4.class) {
				if(person == null) {
					person = new Person4();
				}
			}
			
		}
		return person;
	}
  这是比较好的方式,这种方式可能在第一次执行这段代码的时候会比较慢一些,因为使用了双重判断,但是当第一次初始化完成以后,后面的效率则会大大增加。


   小结

   单例模式是我们必须掌握的一个模式,在项目中用的非常多,尤其是后面的双重检查机制,需要我们好好的体会并发情况下的好处!

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

g-Jack

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值