大话设计模式--单例模式

    有时候需要单独创建一个类,创建了之后就用哪个对象。就有了单例模式。

    简单的单例模式:

    

package along;

public class AlongForm {
	private static AlongForm along = null;
	private AlongForm(){}
	public static AlongForm getInstence(){
		if(along==null){
			along = new AlongForm();
		}
		return along;
	}
	public static void main(String[] args) {
		AlongForm along1 = AlongForm.getInstence();
		AlongForm along2 = AlongForm.getInstence();
		System.out.println(along1 == along2);
		
	}
} 

输出:true

有次可以见,只要将构造方法变成了私有,就可以不让外部用new 的方式去创建对象.只要提供一个getInstence方法就可以获得它的对象. 这就是常说的懒汉式单例模式.

    但是这样的单例模式,在多线程中 就是不安全的, 在极限环境下,会有2个线程同时通过判断,然后创建2个对象.既就违反了单例模式的意义.

    说以就需要加入 双重锁定:

    

package along;

public class AlongForm2 {
	private static AlongForm2 along2 ;
	private AlongForm2(){}
	public static void  getInstence(){
		if(along2==null){
			synchronized (along2) {
				if(along2==null){
					along2 = new AlongForm2();
				}
			}
		}
		
	}
}

由以上代码可以看出,先判断对象是不是存在,然后再给对象上锁,这里又给它上一个是否为null的判断,是因为,当极限条件下,2个线程都通过了第一个判断,然后第一个线程加锁时,第二个等待,仍要进行判断,不然第二个线程进入锁后仍然会创建一个对象,所以要加上双重判断才行!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值