- 核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
- 优点:(1)由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决(2)单例模式可以在系统设置全局的访问点,优化环共享资源访问。
- 五种单例模式实现方式
(1)饿汉式(线程安全,调用效率不高。不能延时加载)
public class SingletonDemo02{
private static SingletonDemo02=new SingletonDemo02();
private SingletonDemo02(){}
public static SingletonDemo02 getInstance(){
return s;
}
}
//饿汉式单例模式模式代码中,static变量会在类装载时初始化,此时也不会涉及多个线程访问该对象的问题。
(2)懒汉式(线程安全,调用效率不高,但可以延时加载)
public class SingletonDemo01{
private static SingletonDemo01 s;
private SingletonDemo01{}
public static synchronized SingletonDemo01 getInstance(){
if(s==null){
s=new SingletonDeml01();
}
return s;
}
}
(3)双重检测锁模式
此模式一般不建议使用,作为了解使用。
public class SingletonDemo03{
private static SingletonDemo03 instance=null;
public static SingletonDemo getInstance(){
if(instance=null){
SingletonDemo03 sc;
synchronized(SingletonDemo03.class){
sc=instance;
if(sc==null){
synchronized(SingletonDemo03.class){
if(sc==null){
sc=new SingletonDemo03();
}
}
instance=sc
}
}
}
return instance;
}
private SingletonDemo03(){}
}
(4)静态内部类实现(线程安全,调用效率高,可延时加载)
public class SingletonDemo04{
private static class SingletonClassInstance(){
private static final SingletonDemo04 instance=new SingletonDemo04();
}
public static SingletonDemo04 getInstance(){
return SingletonClassInstance.instance;
}
private SingleDemo04(){}
}
(5)枚举实现单例模式
(线程安全,调用效率高,不能延时加载)
public enum SingletonDemo05{
//定义一个枚举的元素,它就代表了singleton的一个实例
INSTANCE;
}