public class BuildServlet {
/*
* 单例模式,只创建一次
* 单例模式设计原则(堆内存中永远只有一个对象):
* 1:将自己设为静态成员变量
* 2:将构造方法私有化
* 3:公开一个方法专门用来实例化,并且判断该对象是否在堆内存中存在
* 4:如果没有则创建
*
* 一个类不能通过new出来,而是通过静态方法newInstance方法实例化对象说明它是单例的
*/
private static BuildServlet servlet;
private BuildServlet(){
}
/*
* 这里只在第一次创建对象时加锁,并不是每一次吊用newInstance方法时都同步。
* 并且我们进行了两次判空,其实第二次判空是很有必要的。
* 如果不进行第二次判空,即步骤(2)不存在,我们可以假设如下一种情况:
* 当A,B同时调用newInsatance方法,并且A,B同时进入(1),此时B被锁在外面,A抢占先机进入(3)创建一个实例
* 当A执行完毕,跳出synchronized,B再次进入(3),那么此时就会出现A和B都创建了一个实例,然而这和我们单例设计模式的要求是相悖的。
* 所以必须要加第二次判空
*
* */
public static BuildServlet newInstance(){
if(servlet==null){ //(1)
synchronized (BuildServlet.class) {
if(servlet==null){ //(2)
servlet=new BuildServlet(); //(3)
}
}
servlet=new BuildServlet();
}
return servlet;
}
/* public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
BuildServlet.newInstance();
BuildServlet.newInstance();
BuildServlet.newInstance();
BuildServlet.newInstance();
}
}).start();
}
*/
}
}