欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-05 14:05:56
...

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

    简单的单例模式:

    

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个线程都通过了第一个判断,然后第一个线程加锁时,第二个等待,仍要进行判断,不然第二个线程进入锁后仍然会创建一个对象,所以要加上双重判断才行!