- 饿汉模式
public class JDBCSingleton1 {
/**
* 构造函数私有,避免类在外部被实例化
*/
private JDBCSingleton1(){
}
private static final JDBCSingleton1 jdbcSingleton = new JDBCSingleton1(); // 饿汉模式,线程安全
public static JDBCSingleton1 getJDBCSinleton(){
return jdbcSingleton;
}
}
- 懒汉模式1–线程不安全
public class JDBCSingleton2 {
/**
* 构造函数私有,避免类在外部被实例化
*/
private JDBCSingleton2(){
}
private static JDBCSingleton2 jdbcSingleton = null; // 懒汉模式1,线程不安全
public static JDBCSingleton2 getJDBCSinleton(){
if(jdbcSingleton == null){
jdbcSingleton = new JDBCSingleton2();
}
return jdbcSingleton;
}
}
- 懒汉模式2–加synchronized控制,线程安全,效率低
public class JDBCSingleton3 {
/**
* 构造函数私有,避免类在外部被实例化
*/
private JDBCSingleton3(){
}
private static JDBCSingleton3 jdbcSingleton = null; // 懒汉模式2,在方法上加syncronized,线程安全
public synchronized static JDBCSingleton3 getJDBCSinleton(){ // 每次都要同步,效率低
if(jdbcSingleton == null){
jdbcSingleton = new JDBCSingleton3();
}
return jdbcSingleton;
}
}
- 懒汉模式3–双重检查锁定,线程安全,效率较高
public class JDBCSingleton4 {
/**
* 构造函数私有,避免类在外部被实例化
*/
private JDBCSingleton4(){
}
private static JDBCSingleton4 jdbcSingleton = null; // 懒汉模式3,双中检查锁定,线程安全
public static JDBCSingleton4 getJDBCSinleton(){ // synchronized关键字不加在方法上,避免每次都要同步,显著提升性能
if(jdbcSingleton == null){
synchronized(JDBCSingleton4.class){
if(jdbcSingleton == null){
jdbcSingleton = new JDBCSingleton4();
}
}
}
return jdbcSingleton;
}
}
- 懒汉模式4–静态内部类,线程安全,效率最高
public class JDBCSingleton5 {
/**
* 构造函数私有,避免类在外部被实例化
*/
private JDBCSingleton5(){
}
static class JDBCSingletonHolder {
private static JDBCSingleton5 jdbcSingleton = new JDBCSingleton5(); // 懒汉模式4,静态内部类,线程安全,利用classloader的机制来保证初始化instance时只有一个线程,效率最高,推荐使用
}
public static JDBCSingleton5 getJDBCSinleton(){
return JDBCSingletonHolder.jdbcSingleton;
}
}
结论&注意
1、推荐使用静态内部类创建单例
2、单例失效:通过Java反射机制是能够实例化构造方法为private的类的,使得Java单例实现失效