枚举实现单例模式:
public enum DataSourceEnum {
DATASOURCE;
private DBConnection connection = null;
private DataSourceEnum() {
connection = new DBConnection();
}
public DBConnection getConnection() {
return connection;
}
}
(二)经典单例模式
1、饿汉式单例(立即加载方式)
饿汉式单例在类加载初始化时就创建好一个静态的对象供外部使用,除非系统重启,这个对象不会改变,所以本身就是线程安全的。
// 饿汉式单例
public class Singleton {
// 私有构造
private Singleton() {}
private static Singleton single = new Singleton();
// 静态工厂方法
public static Singleton getInstance() {
return single;
}
}
2、懒汉式单例(延迟加载方式)
该示例虽然用延迟加载方式实现了懒汉式单例,但在多线程环境下会产生多个single对象
// 懒汉式单例
public class Singleton {
// 私有构造
private Singleton() {}
private static Singleton single = null;
public static Singleton getInstance() {
if(single == null){
single = new Singleton();
}
return single;
}
}
添加同步锁
public class Singleton {
// 私有构造
private Singleton() {}
private static Singleton single = null;
public static Singleton getInstance() {
// 等同于 synchronized public static Singleton getInstance()
synchronized(Singleton.class){
// 注意:里面的判断是一定要加的,否则出现线程安全问题
if(single == null){
single = new Singleton();
}
}
return single;
}
}
该方式运行效率却很低。
public class SingletonFactory {
// 内部枚举类
private enum EnmuSingleton{
Singleton;
private Singleton singleton;
//枚举类的构造方法在类加载是被实例化
private EnmuSingleton(){
singleton = new Singleton();
}
public Singleton getInstance(){
return singleton;
}
}
public static Singleton getInstance() {
return EnmuSingleton.Singleton.getInstance();
}
}
class Singleton{
public Singleton(){}
}