当前位置: 代码迷 >> 综合 >> java设计模式之单利模式
  详细解决方案

java设计模式之单利模式

热度:100   发布时间:2023-09-18 20:28:44.0

单例模式
    单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例(一个类在java虚拟机中只有一个对象,并提供一个全局访问点)。
    适用范围:如数据库的链接对象、属性配置文件的读取对象、线程池、缓存、日志对象等等。
    模式结构:分别为饿汉式和懒汉式(如果考虑性能问题的话,就使用懒汉式,),构造器私有化,对外提供方法如同步关键字。
    
饿汉式(立即加载方式):
     public class HurgrySingleton {  
       private static HurgrySingleton hurgry=new HurgrySingleton();  
       private HurgrySingleton(){};  
       public static HurgrySingleton getSinletonHurgry(){  
           return hurgry;  
        }  
    }  
    饿汉式单例在类加载初始化时就创建好一个静态的对象供外部使用,除非系统重启,这个对象不会改变,所以本身就是线程安全的。
    
懒汉式代码(延迟加载方式):
    1,普通懒汉式单例
    public class LarzySingleton {  
       private static LarzySingleton larzy=null;  
       private LarzySingleton(){};  
       public static LarzySingleton getSinletonLarzy(){  
            if(larzy==null){  
              larzy=new LarzySingleton();  
           }  
        return larzy;  
      }  
   }  
   这种方式虽然使用懒加载的方式实现了懒汉式单例,但是由于不是线程安全的,所以在多线程的环境下会产生多个实例对象。

    2,使用多线程同步锁
     public class LarzySingleton {  
       private static LarzySingleton larzy=null;  
       private LarzySingleton(){};  
       public static LarzySingleton getSinletonLarzy(){  
           synchronized(LarzySingleton.class){    
            if(larzy==null){  
              larzy=new LarzySingleton();  
            }  
           }
        return larzy;  
      }  
    }  
     这种在方法上加同步锁或是在同步代码块中加同步锁,虽然解决了多个实例对象的
     为题,但是它的运行效率却很低下。
     
    3,进一步优化
    public class LarzySingleton {  
       private static LarzySingleton larzy=null;  
       private LarzySingleton(){};  
       public static LarzySingleton getSinletonLarzy(){  
            if(larzy==null){  
               synchronized(LarzySingleton。class){
                 if(larzy==null){
                     larzy=new LarzySingleton();
                 }
               }
            }  
        return larzy;  
      }  
   }  
   使用这种双重检查进行进一步优化,可以避免整个方法被锁,只对需要锁的代码部分加锁,
   可以提高执行的效率。