单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点(原书)
举个例子:例如计划生育,每对夫妇只能有一个孩子:
public class Main {
public static void main(String[] args) {
Children children_1 = Children.getInstance();
Children children_2 = Children.getInstance();
System.out.println(children_1 == children_2);
}
}
class Children {
private static Children children;
private Children() {}
public static Children getInstance() {
if (null == children){
children = new Children();
}
return children;
}
}
运行结果:
true
可以看到,Children类的构造方法被私有化了,而取得该类对象的方法只有调用getInstance方法,并且getInstance方法只有在静态对象children为null是才会生成对象返回,所以children_1和children_2指向的都是同一个对象。
但是在多线程的情况下,还是会有实例被多次构造(也就是children = new Children();这句被重复执行)的可能,因此需要加上同步关键字synchronized:
public static Children getInstance(){
synchronized (Children.class){
if (null == children){
children = new Children();
}
}
return children;
}
但这样就会造成性能的问题:每次调用getInstance方法都要加锁执行同步块里面的内容,可以优化一下,在外层加一个是否为空的判断:
public static Children getInstance(){
if (null == children){
synchronized (Children.class){
if (null == children){
children = new Children();
}
}
}
return children;
}
上面的例子都属于懒汉式的单例模式:只有调用getIntance才会构建对象
下面看看饿汉式的,在类加载的时候就把对象给new出来了,因此就不存在多线程问题:
class Children {
private final static Children children = new Children();
private Children(){}
public static Children getInstance(){
return children;
}
}