三个要素
1、私有的构造方法
2、指向自身的静态实例引用
3、公有的静态的获取自身实例方法
饿汉式
public class Singleton{
private static Singleton singleton = new Singleton();
private Singleton(){};
public static Singleton getInstance(){
return singleton;
}
}
懒汉式
public class Singleton{
private static Singleton singleton;
private Singleton(){};
public static Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
但是以上方式在多线程环境下会出现问题,可能会new出来多个实例。
固需加锁,但是直接在方法上加synchronized关键字,每次获取实例都会加锁,而事实上只需在创建实例的时候才需加锁。故将getInstance方法改成如下:
public static Singleton getInstance() {
if (singleton== null) {
synchronized (singleton) {
if (singleton== null) {
singleton= new Singleton();
}
}
}
return singleton;
}
当然也可以将创建实例的过程与获取实例的过程分开。