一、单例模式:一个类只有一个对象实例,节省内存,有利于垃圾回收
二、几种实现方式
1、饿汉模式:类加载的时候创建类实例,特点是加载类的时候比较慢,但是运行获取对象的速度比较快。
/**
* @author huangsen
* 单例模式实现:饿汉模式
*/
public class SingletonDemo1 {
private static SingletonDemo1 singleton = new SingletonDemo1();
private SingletonDemo1(){
}
public static SingletonDemo1 getInstance(){
return singleton;
}
}
2、懒汉模式:使用的时候创建类实例,特点是获取对象的速度比较慢,类加载的速度比较快。
(1)缺点:多线程下不能正常工作
/**
* @author huangsen
* 单例模式实现:懒汉模式(非线程安全)
*/
public class SingletonDemo2 {
private static SingletonDemo2 singleton = null;
private SingletonDemo2(){}
public static SingletonDemo2 getInstance(){
if (singleton==null){
singleton = new SingletonDemo2();
}
return singleton;
}
}
(2)多线程下可以正常工作,因为锁(synchronized)效率低
/**
* @author huangsen
* 单例模式实现:懒汉模式(线程安全)
*/
public class SingletonDemo3 {
private static SingletonDemo3 singleton = null;
private SingletonDemo3(){}
public static synchronized SingletonDemo3 getInstance(){
if (singleton==null){
singleton = new SingletonDemo3();
}
return singleton;
}
}
3、静态内部类方式:外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化对象实例,故而不占内存。这种方法不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。
/**
* @author huangsen
* 单例模式实现:静态内部类
*
*/
public class SingletonDemo4 {
private static class SingletonInner{
private static SingletonDemo4 singleton = new SingletonDemo4();
}
private SingletonDemo4(){}
public static SingletonDemo4 getInstance(){
return SingletonInner.singleton;
}
}