美文网首页
单例模式(线程安全)

单例模式(线程安全)

作者: 紫雨杰 | 来源:发表于2018-04-22 16:45 被阅读0次

    1、单例模式就是系统中对于某类只能有一个对象

    方式一:(不使用同步锁)

           public class Singleton {
                 private static Singleton instance= new Singleton();   //直接初始化一个实例对象
                 private Singleton() {}     //private 类型的构造函数,保证其它类对象不能直接new一个该对象的实例
                 public static Singleton getInstance() {    //该类唯一一个public 方法
                        return instance;
                 } 
            }
    
        上述代码中的一个缺点是:该类加载的时候就会直接new一个静态对象,当系统中这样的类较多时,会使得启动速度变慢。
    

    方式二:(使用同步锁)

           public class Singleton {
                 private static Singleton instance; 
                 private Singleton() {}     //private 类型的构造函数,保证其它类对象不能直接new一个该对象的实例
                 public static synchronized Singleton getInstance() {    //对获取实例的方法进行同步
                        if (instance == null) {
                                  instance = new Singleton();
                        }
                        return instance;
                 } 
            }
    
         上述代码锁的粒度有点大
    

    方式三:(使用双重同步锁)

           public class Singleton {
                 private static Singleton instance; 
                 private Singleton() {}     //private 类型的构造函数,保证其它类对象不能直接new一个该对象的实例
                 public static Singleton getInstance() {    //对获取实例的方法进行同步
                        if (instance == null) {
                                synchronized(Singleton.class) {
                                        if (instance == null) {
                                               instance = new Singleton();
                                        }
                                }
                        }
                        return instance;
                 } 
            }
    

    方式四:(更好的是采用下面的方式,既不用加锁,也能实现懒加载)

           public class Singleton {         
                 private Singleton() {}     //private 类型的构造函数,保证其它类对象不能直接new一个该对象的实例
                 private static class Inner {             //采用内部类的方式
                         private static Singleton instance = new Singleton();
                 }
                 public static Singleton getInstance() {   
                        return Inner.instance;
                 } 
            }
    

    相关文章

      网友评论

          本文标题:单例模式(线程安全)

          本文链接:https://www.haomeiwen.com/subject/buyvkftx.html