java单例设计模式详解

/*
 * 单例设计模式:
 * 避免其它程序过多建立该类对象,
 * 先禁止其他程序建立该类对象。
 * 还要让其他程序访问到该类对象,
 * 在本类中自己定义一个对象。
 * 方便其他程序可以访问,
 * 对外提供访问方式
 * 
 * 体现:
 * 构造函数私有化
 * 在类中创建一个本类对象
 * 提供获取该类对象方法
 */

/*
 * 这种方式叫做饿汉式
 * Singleton类一进内存,就已经创建好了对象
 */

public class Singleton {

	private Singleton() {

	}

	// 这里必须是私有的,要不然外面的程序可以直接访问这个属性了
	private static Singleton s = new Singleton();

	public Singleton getInstance() {
		return s;
	}

}

/*
 * 这种方式叫懒汉式
 * Singleton一进内存,对象还没存在
 * 只有调用了getInstance方法才建立对象
 * 延迟加载
 */
public class Singleton {

	private Singleton() {

	}

	// 这里必须是私有的,要不然外面的程序可以直接访问这个属性了
	private static Singleton s = null;

	public Singleton getInstance() {
		if (s == null) {
			s = new Singleton();
		}
		return s;
	}

}

/*
 * 饿汉式,简单,安全,懒汉式存在缺陷, 因为如果A、B同时调用懒汉式的getInstance方法, A调用时,执行到s==null不执行了,
 * cpu去执行B的getInstance方法去了, 执行到s==null的时候也不执行了,cpu又去执行A了,
 * 然后Anew了个对象赋值给了s,返回了。然后cpu又去执行B, B也new了个对象赋值给s,把A里的s覆盖掉了!,也返回了,
 * 这时候就不是同一对象了(典型的线程同步问题, 解决方案是在getInstance方法上加上synchronized,
 * 把s对象锁起来就好了)加上锁程序效率就低了 最终解决方案:双重判断、减少读锁次数
 */
/*
 * public Singleton getInstance() { if(s == null) { synchronized
 * (Singleton.class) { if(s == null) { s = new Singleton(); } } } return s; }
 */

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值