单例模式:保证一个类只有一个实例
应用场景:
1.spring bean模式是单例模式,便于管理
2.数据库连接池单例模式,确保只有一个实例
3.读取配置文件也可以用单例模式
实现方法:
1.懒汉模式:访问效率底,懒加载,线程安全
/**
* 单例懒汉模式
* @author liuxg
* @date 2016年5月24日 上午7:43:31
*/
public class Singleton01 {
private static Singleton01 single01 ;
private Singleton01(){};
/**
* 避免并发访问
* @return
*/
public static synchronized Singleton01 getInstance(){
if (single01 == null) {
single01 = new Singleton01() ;
}
return single01 ;
}
public static void main(String[] args) {
Singleton01 single010 = Singleton01.getInstance();
Singleton01 single011 = Singleton01.getInstance();
System.out.println(single010 == single011);
}
}
2.饿汉模式:急加载,访问效率高,线程安全
/**
* 单例饿汉模式
* @author liuxg
* @date 2016年5月24日 上午7:43:31
*/
public class Singleton02 {
private static Singleton02 single01 = new Singleton02();
private Singleton02(){};
public static Singleton02 getInstance(){
return single01 ;
}
public static void main(String[] args) {
Singleton02 single010 = Singleton02.getInstance();
Singleton02 single011 = Singleton02.getInstance();
System.out.println(single010 == single011);
}
}
3.静态内部类:线程安全,访问效率高,懒加载
/**
* 静态内部类实现单例模式
* 1.线程安全,2。懒加载 3,访问效率高
* @author liuxg
* @date 2016年5月24日 上午7:43:31
*/
public class Singleton03 {
private static class Singleton03Instance {
private static final Singleton03 instance = new Singleton03();
}
public static Singleton03 getInstance() {
return Singleton03Instance.instance;
}
private Singleton03() {
};
public static void main(String[] args) {
System.out.println(Singleton03.getInstance() == Singleton03.getInstance());
}
}
4.枚举类型:线程安全,访问效率高,急加载,枚举天生是单例
/**
* 枚举类型默认就是单例的
* 1.线程安全,2.没有懒加载 3.访问效率高
* @author liuxg
* @date 2016年5月24日 上午7:43:31
*/
public enum Singleton04 {
INSTANCE ;
public static void main(String[] args) {
System.out.println(Singleton04.INSTANCE == Singleton04.INSTANCE);
}
}