简单总结单例模式的4种写法

一、单例模式

属于创建者模式的一种, 单例模式的目的是使该类只有一个实例,同一个类的不同对象有不同的hashCode()

单例模式是由该类自行创建唯一个向外暴露的全局的对象

二、写法

  • 饿汉式:无线程安全,但是类以加载就会创建实例,浪费资源
  • 懒汉式:存在线程安全,需要加synchroined
  • 内部类:无线程安全(完美方案)
  • 枚举: 线程安全,听说是高效java推荐的写法

三、饿汉式

/**
 * 饿汉式:
 * 不适用new创建对象而是使用静态的getInstance()方法创建对象
 * jvm保证线程安全
 */
public class SingleTest{
    public static void main(String[] args) {
        Single single1 = Single.getInstance();
        Single single2 = Single.getInstance();
        System.out.println(single1.hashCode());
        System.out.println(single2.hashCode());
        System.out.println(single1 == single2);
    }
}

class Single {
    final static Single INSTANCE = new Single();
    public static Single getInstance(){return INSTANCE;}
}

四、懒汉式

//懒汉式的线程安全的写法又称为双检索懒汉模式
public class SingleTest {
    public static void main(String[] args) {
        for(int i = 0;i < 10; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Single.getInstance().hashCode());
                }
            }).start();
        }
    }
}

class Single{
    private static Single instance = null;
    Single(){}
    public static Single getInstance(){
      if (instance == null){
          synchronized (Single.class) {
              if(instance == null){
                  try{
                     Thread.sleep(1);
                  }catch (Exception e){
                     e.printStackTrace();
                  }
                 instance = new Single();
              }
          }
      }
      return instance;
    }
}

五、内部类

/**
 * 静态内部类:完美写法
 */
public class SingleTest {
    public static void main(String[] args) {
        Single single1 = Single.getInstance();
        Single single2 = Single.getInstance();
        System.out.println(single1.hashCode());
        System.out.println(single2.hashCode());
        System.out.println(single1 == single2);
    }
}

class Single{
    private static Single instance;

    public static Single getInstance(){
        return InnerSingle.INSTANCE;
    }

    private static class InnerSingle{
        private final static Single INSTANCE = new Single();
    }
}

六、枚举

//枚举:完美写法
public class SingleTest {
    public static void main(String[] args) {
        Single single1 = Single.INSTANCE;
        Single single2 = Single.INSTANCE;
        System.out.println(single1.hashCode());
        System.out.println(single2.hashCode());
        System.out.println(single1 == single2);
    }
}

enum Single{
    INSTANCE;
}

七、结论

优点:

  • 单例模式可以保证内存里只有一个实例,减少了内存的开销。
  • 避免对资源的多重占用
  • 单例模式设置全局访问点,可以优化和共享资源的访问。

缺点:

  • 没有接口,扩展不了代码,违背了开闭原则
  • 单例模式的功能代码通常写在一个类中,如果功能设计不合理,则很容易违背单一职责原则。

到此这篇关于简单总结单例模式的4种写法的文章就介绍到这了,更多相关单例模式的4种写法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java单例模式的8种写法(推荐)

    单例:Singleton,是指仅仅被实例化一次的类. 饿汉单例设计模式 一.饿汉设计模式 public class SingletonHungry { private final static SingletonHungry INSTANCE = new SingletonHungry(); private SingletonHungry() { } public static SingletonHungry getInstance() { return INSTANCE; } } 因为单例对象

  • Java中单例模式的7种写法

    第一种(懒汉,线程不安全): public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这种写法lazy loading很明显,但是致命的是在多线程不能正常工作.

  • 浅谈java 单例模式DCL的缺陷及单例的正确写法

    1 前言 单例模式是我们经常使用的一种模式,一般来说很多资料都建议我们写成如下的模式: /** * Created by qiyei2015 on 2017/5/13. */ public class Instance { private String str = ""; private int a = 0; private static Instance ins = null; /** * 构造方法私有化 */ private Instance(){ str = "hell

  • Java版的7种单例模式写法示例

    前言 今天看到某一篇文章的一句话 单例DCL 前面加 V .就这句话让我把 单例模式 又仔细看了一遍. Java 中的 单例模式 是我们一直且经常使用的设计模式之一,大家都很熟悉,所以这篇文章仅仅做我自己记忆. 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 单例模式 涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方式,可以直接访问,

  • 简单总结单例模式的4种写法

    一.单例模式 属于创建者模式的一种, 单例模式的目的是使该类只有一个实例,同一个类的不同对象有不同的hashCode() 单例模式是由该类自行创建唯一个向外暴露的全局的对象 二.写法 饿汉式:无线程安全,但是类以加载就会创建实例,浪费资源 懒汉式:存在线程安全,需要加synchroined 内部类:无线程安全(完美方案) 枚举: 线程安全,听说是高效java推荐的写法 三.饿汉式 /** * 饿汉式: * 不适用new创建对象而是使用静态的getInstance()方法创建对象 * jvm保证线

  • Java中单例模式的七种写法示例

    目录 前言 1.饿汉式(线程安全)⭐ 2.懒汉式(线程不安全)⭐ 3.懒汉式(加锁) 4.懒汉式(双重校验锁)⭐ 5.单例模式(静态内部类) 6.单例模式(CAS) 7.单例模式(枚举) 总结 前言 大家好,我是三乙己.考上大家一考:"单例模式的单例,怎样写的?" "不就是构造方法私有化么?" "对呀对呀!--单例模式有七种写法,你知道么?" 言归正传-- 单例模式(Singleton Pattern)可以说是最简单的设计模式了. 用一个成语来形

  • Python实现单例模式的五种写法总结

    目录 使用模块 使用装饰器 基于 __new__ 方法实现 基于 metaclass 方式实现 单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息.如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConf

  • 简单了解python单例模式的几种写法

    方法一:使用装饰器 装饰器维护一个字典对象instances,缓存了所有单例类,只要单例不存在则创建,已经存在直接返回该实例对象. def singleton(cls): instances = {} def wrapper(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return wrapper @singleton class Fo

  • C#中单例模式的三种写法示例

    第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我-- 复制代码 代码如下: public class Singleton {     private static Singleton _instance = null;     private Singleton(){}     public static Singleton CreateInstance()     {         if(_instance == null)         {  

  • Java单例模式的几种常见写法

    目录 1.饿汉模式 2.懒汉模式 3.静态内部类 4.枚举 总结 1.饿汉模式 饿汉模式也叫预加载模式,它是在类加载时直接创建并初始化单例对象,所以它并不存在线程安全的问题.它是依靠 ClassLoader 类机制,在程序启动时只加载一次,因此不存在线程安全问题,它的实现代码如下: public class Singleton { // 1.防止外部直接 new 对象破坏单例模式 private Singleton() {} // 2.通过私有变量保存单例对象 private static Si

  • Java单例模式的6种实现方式详解

    目录 为什么使用单例模式 使用单例模式需要注意的关键点 单例模式的几种写法 1. 饿汉式 2. 懒汉式 3. DCL(Double CheckLock)实现单例 4. 静态内部类 5. 枚举单例 6. 容器实现单例 总结 为什么使用单例模式 需要确保某个类只要一个对象,或创建一个类需要消耗的资源过多,如访问IO和数据库操作等,这时就需要考虑使用单例模式了. 使用单例模式需要注意的关键点 将构造函数访问修饰符设置为private 通过一个静态方法或者枚举返回单例类对象 确保单例类的对象有且只有

  • java编程创建型设计模式单例模式的七种示例

    目录 1.什么是单例模式? 2.七种写法 2.1饿汉式(静态常量) 2.2饿汉式(静态代码块) 2.3懒汉式(线程不安全) 2.4懒汉式(线程安全,同步方法) 2.5双重校验锁 2.6静态内部类 2.7枚举 3.单例模式在JDK中的应用(简单的源码分析) 4.单例模式总结 1.什么是单例模式? 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法). 比如Hibernate的 SessionFactory,

随机推荐