大话设计模式--单例模式
程序员文章站
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个线程都通过了第一个判断,然后第一个线程加锁时,第二个等待,仍要进行判断,不然第二个线程进入锁后仍然会创建一个对象,所以要加上双重判断才行!
下一篇: php codeigniter