java单例模式的4种实现方法-创新互联

单例模式的定义:
  • 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例
单例模式的分类:
  • 立即加载/“饿汉模式”
    • 立即加载就是在使用类的时候已经将对象创建完毕
    • 立即加载在中文语义上有“着急”,“急迫”的含义,因此又称为“饿汉模式”
    • 普通的立即加载:
      public class MyObject{
      private static MyObject mb = new MyObject();
      private MyObject(){}
      public static MyObject getInstance() {
         return mb;
      }
      }
  • 延迟加载/“懒汉模式”
    • 延迟加载是在调用getInstance()方法获取实例对象时才创建对象
    • 延迟加载在中文语义上有“缓慢”,“不急迫”的含义,因此又称为“懒汉模式”
    • 普通的延迟加载:
      public class MyObject{
      private static MyObject mb;
      private MyObject(){}
      public static MyObject getInstance() {
         if (mb == null)
           mb = new MyObject();
         return mb;
      }
      }
延迟加载/“懒汉模式”的缺点
  • 虽然上述的代码可以实现单例设计模式,但是在多线程环境中,前面的延迟加载的代码是完全错误的,根本不能实现保持单例的状态。因为多线程环境中,会存在多个线程调用getInstance()方法的情况,由于线程安全的问题就会导致创建出多个实例
单例模式的几种实现方法

1.使用DCL双重检查锁机制实现

成都创新互联于2013年创立,是专业互联网技术服务公司,拥有项目成都网站建设、网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元蒙自做网站,已为上家服务,为蒙自各地企业和个人服务,联系电话:18982081108
  • 虽然直接在方法上使用synchronized上锁也能实现线程安全的单例,但是性能非常差,使用DCL机制后不仅线程安全还能使性能有所提升
  • 属于延迟加载
  • 代码:
    public class MyObject{
    private static MyObject mb;
    private MyObject(){}
    public static MyObject getInstance() {
       if (mb == null) {
         synchronized (MyObject.class) {
           if (mb == null) {
             mb = new MyObject();
           }
         }
       }  
       return mb;
    }
    }

    2.使用静态内置类实现单例模式

  • 静态内部类和静态属性属性会在类加载是时候执行,因此使用类的使用就将实例对象创建好了,属于立即加载
  • 也因为只在类加载的时候加载一次并将对象创建完毕,因此线程是安全的
  • 代码:
    public class MyObject{
    //内部类方式
    private static class MyObjectHandler {
       private static MyObject mb =  new MyObject();
    }
    private MyObject(){}
    public static MyObject getInstance() {
       return MyObjectHandler.mb;
    }
    }

    3.使用static代码块实现单例模式

  • 和使用静态内部类的方式一样,也是在类加载的时候将实例对象创建好了,所以线程也是安全的
  • 代码:
    public class MyObject{
       private static MyObject mb = null;
       private MyObject(){}
       static {
         mb = new MyObject();
       }
       public static MyObject getInstance() {
         return mb;
       }
    }

    4.使用enum枚举数据类型实现单例模式

  • 在使用枚举类的时候构造方法会被自动调用,而且通过反射也无法获取枚举中的属性和方法因此线程也是安全的
  • 代码:
public enum MyEnum{
   connectionFactory;
   private Connection connection;
   //枚举类的构造方法默认是private的,所以访问限定符private可以省略不写
   MyEnum {
     MysqlDataSource dataSource = new MysqlDataSource();
     dataSource.setURL();
     dataSource.setUser();
     dataSource.setPassword();
     connection = dataSource.getConnection();
   }
   public Connection getInstance() {
     return connection;
   }
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:java单例模式的4种实现方法-创新互联
文章出自:http://azwzsj.com/article/hccsc.html