java笔记 单例模式

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

单例模式:顾名思义,就是让程序使用者只在任何时候就只能创建一个实例化对象。

基本实现思想:

1.不能让其他类随便建立该类的对象

2.同时可以在本类中生产一个自己的对象

3.可以对外提供获取本类中以生产的对象的方法

这样就可以保证,本类的对象在堆内存中只有一个,而对其的引用可以有多个,可以用一下代码来体现:

public class TestSingle {
	public static void main(String[] args) {
		Single s1 = Single.getInstnce();
		Single s2 = Single.getInstnce();
		s1.setName("aaa");
		System.out.println(s2.getName());
	}
}

class Single {
	/**
	 * 为了保证其他类不能创建本类对象,将对应构造函数私有化即可(这里以空参数构造函数为例)
	 */
	private Single() {
	}

	/**
	 * 在本类中创建一个本类的对象,设置为静态是因为下面的方法, 因为方法不能通过对象打点方式调用,故只能是静态的,故此处s对象为静态对象
	 */
	private static Single s = new Single();

	/**
	 * 此方法是对外提供的,故其权限为public,又因其不能通过对象打点方式调用, 故为静态的,故s对象也为静态的
	 * 
	 * @return s对象
	 */
	public static Single getInstnce() {
		return s;
	}

	/**
	 * 为了检验,此处给一变量和其封装方法
	 */
	private String name;

	public String getName() {
		return name;
	}

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

}

以上是单例模式中的一种实现形式,习惯上称之为饿汉式。

还有一种实现方式,称之为懒汉式,代码如下(为了突出表示,省去部分代码):

class Single {
	/**
	 * 为了保证其他类不能创建本类对象,将对应构造函数私有化即可(这里以空参数构造函数为例)
	 */
	private Single() {
	}

	/**
	 * 此处并未真正创建对象,而是创建了一个空引用
	 */
	private static Single s = null;

	/**
	 * 此方法是对外提供的,故其权限为public,又因其不能通过对象打点方式调用, 故为静态的,故s对象也为静态的
	 * 
	 * @return s对象
	 */
	public static Single getInstnce() {
		//s为空时才在这里创建对象
		if (s == null) {
			s = new Single();
		}
		return s;
	}

}

饿汉式与懒汉式的不同之处在于,是否在类加载的时候就创建对象了,饿汉式在类加载的过程中就直接创建对象了,而懒汉式知道调用方法时才创建。

除了以上的区别外,饿汉式是线程安全的,故企业开发中常用,而懒汉式是非线程安全的,可以做以下改进:

 

class Single {
	/**
	 * 为了保证其他类不能创建本类对象,将对应构造函数私有化即可(这里以空参数构造函数为例)
	 */
	private Single() {
	}

	/**
	 * 此处并未真正创建对象,而是创建了一个空引用
	 */
	private static Single s = null;

	/**
	 * 此方法是对外提供的,故其权限为public,又因其不能通过对象打点方式调用, 故为静态的,故s对象也为静态的
	 * 
	 * @return s对象
	 */
	public static Single getInstnce() {
		// s为空时才在这里创建对象
		if (s == null) {
			//在此处加同步锁即可
			synchronized (Single.class) {
				s = new Single();
			}
		}
		return s;
	}
}


 

安全机制即为在创建对象的时候运用双重判断,并在内层判断中加同步锁,也可在方法上直接加同步锁而方法内只进行一次判断,但同步锁会带来低效问题,且方法上加锁的话,每次都得进行加锁操作,为了减少加锁带来的低效问题,故使用双重判断并在内层判断中加同步锁以减少加锁次数。


总结:显然,我们使用单例是为了使用单例所产生的对象,所以一般情况下开发用饿汉式!


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值