饿汉式
饿汉式单例在类加载初始化时就创建好一个静态的对象供外部使用,除非系统重启,这个对象不会改变,所以本身就是线程安全的。
Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,会使Java单例实现失效)
public class SingletonClass {
private static final SingletonClass getInstance = new SingletonClass();
private SingletonClass(){}
public SingletonClass getSingletonClass2(){
return getInstance;
}
}
懒汉式
在方法上加synchronized同步锁或是用同步代码块对类加同步锁,此种方式虽然解决了多个实例对象问题,但是该方式运行效率却很低下,下一个线程想要获取对象,就必须等待上一个线程释放锁之后,才可以继续运行。
public class SingletonClass {
private static SingletonClass getInstance = null;
private SingletonClass(){}
public SingletonClass getSingletonClass(){
synchronized (SingletonClass.class){//同步锁
if (getInstance == null){
getInstance = new SingletonClass();
}
}
return getInstance;
}
}