1、饿汉式
饿汉式就是类加载后就创建好了单例,直接拿就行,但该方法容易产生垃圾

public class Singleton1 {//构造器私有化 防止外部实例private Singleton1() {}private static final Singleton1 SINGLETON_1 = new Singleton1();public static Singleton1 getInstance(){return SINGLETON_1;}
}

2、懒汉式,线程不安全
懒汉式就是,只有我使用的时候才去创建对象,但多线程条件下可能会破坏单例

public class Singleton2 {//构造器私有化 防止外部实例private Singleton2(){}private static  Singleton2 SINGLETON_2;public static  Singleton2 getInstance(){if (SINGLETON_2 == null){SINGLETON_2 = new Singleton2();}return SINGLETON_2;}
}

3、线程安全的懒汉式

使用volatile防止了指令重排,不加可能会产生半初始化对象(加载了但没有执行构造函数)
使用synchronized时对象为null时使线程同步防止创建多个对象

public class Singleton3 {private Singleton3(){}private static volatile Singleton3 SINGLETON_3;public static Singleton3 getInstance(){if (SINGLETON_3 == null){synchronized(Singleton3.class){SINGLETON_3 = new Singleton3();}}return SINGLETON_3;}
}

4、使用静态内部类实现懒汉式单例
使用静态内部类去创建单例,因为静态内部类只会实例化一次,所以第一次实例化以后,每次拿到的都是同一个对象,都是那个静态常量

public class Singleton5 {private Singleton5(){}private static Singleton5 singleton5;public static Singleton5 getInstance(){return SingletonHander.singleton;}private static class SingletonHander{private static final Singleton5 singleton = new Singleton5();}
}

5、使用枚举实现懒汉式单例

《Effective Java》

这种方法在功能上与公有域方法相近,但是它更加简洁,无偿提供了序列化机制,绝对防止多次实例化,即使是在面对复杂序列化或者反射攻击的时候。虽然这种方法还没有广泛采用,但是单元素的枚举类型已经成为实现 Singleton的最佳方法。—-《Effective Java 中文版 第二版》

public class Singleton4 implements Serializable {@Serialprivate static final long serialVersionUID = -2675976638179016828L;//构造器私有化private Singleton4(){}private static  Singleton4 SINGLETON4;//调用该方法就会执行SingletonHander.instance.singleton4;执行这个方法就会//加载内部枚举,加载内部枚举类然后会创建一个枚举项,一个枚举项就是一个枚举的实例//所以在创建一个枚举项时会调用内部枚举的构造方法,从而创建一个单例public static Singleton4 getInstance(){return SingletonHander.instance.singleton4;}private enum SingletonHander{instance;//枚举项,每个枚举项只会创建一个private final Singleton4 singleton4;SingletonHander() {singleton4 = new Singleton4();}}
}

java实现单例的5种方法,快收藏相关推荐

  1. Java实现单例的5种方式

    转自:https://blog.csdn.net/u014672511/article/details/79774847 1. 什么是单例模式 单例模式指的是在应用整个生命周期内只能存在一个实例.单例 ...

  2. java使用单例与使用static方法的对于和个人理解

    1最近在重构项目中的老模块,打算引入spring boot对原有项目自己封装的依赖注入模块进行替换.项目中存在大量的工具类,大都是使用static方法编写的,比如时间工具类用于格式化日期,编码工具类用 ...

  3. Java实现单例的几种方式

    1. 什么是单例模式 单例模式指的是在应用整个生命周期内只能存在一个实例.单例模式是一种被广泛使用的设计模式.他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存. 2. 单例模 ...

  4. java 内部类 单例_确保对象的唯一性——单例模式 (四):一种更好的单例实现方法(静态内部类)...

    3.5 一种更好的单例实现方法 饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存:懒汉式单例类线程安全控制烦琐,而且性能受影响.可见,无论是饿汉式单例还是懒汉式单例都存在这样那样的问题,有没有 ...

  5. java单例的几种实现方法

    java单例的几种实现方法: 方式1: public class Something { private Something() {}private static class LazyHolder { ...

  6. java test20006_Java单例7种测试实践

    单例:一个进程中只能存在唯一一个对象. 1.饿汉模式. 主动型太粗暴./** * @author :jiaolian * @date :Created in 2021-01-10 21:25 * @d ...

  7. filter java 是单例的吗_JAVA 设计模式之 单例模式详解

    单例模式:(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点.单例模式是创建型模式.单例模式在现实生活中应用也非常广泛. 在 J2EE 标准中,S ...

  8. 单例设计模式介绍||单例设计模式八种方式——1) 饿汉式(静态常量) 2) 饿汉式(静态代码块) 3) 懒汉式(线程不安全) 4) 懒汉式(线程安全,同步方法)

    单例模式 单例设计模式介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法). 比如Hibernate的 ...

  9. 回字有四种写法,那你知道单例有五种写法吗

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 转自 ...

最新文章

  1. [转]面向GPU的多LOD因子的大规模场景可视化策略
  2. mybatis在控制台打印sql语句
  3. How to mannuly configure vmtools in VM-Ware?
  4. SmartUpload文件上传组件的使用教程
  5. 终于有了属于自己的家,哈哈,很高兴~~
  6. SPEL + 中的错误处理
  7. linux编程两个子进程,Linux中fork同时创建多个子进程的方法
  8. Java Process getOutputStream()方法与示例
  9. 23个Python爬虫开源项目代码Python爬虫开源项目代码
  10. CPU 缓存一致性协议 MESI
  11. 【GD32F303开发之开发工具的安装与配置】
  12. PJzhang:左耳朵耗子-陈皓
  13. php access 单引号,Access VBA教程:字符串中的引号
  14. Rundll32.exe 如何运行dll中的函数
  15. 清华大学计算机学院张远,计算机系2019-2020学年度学生代表大会顺利召开
  16. 产业园区招商策划方案思路
  17. 对“数字+企业数字化+数据中台”的灵魂追问
  18. 【hadoop生态之Hbase】HBase部署与使用【笔记+代码】
  19. 小米9网络位置服务器,如何查看小米9手机当前的IP地址
  20. 【数据库】GaussDB

热门文章

  1. 计算机组成原理总结心得,计算机组成原理心得
  2. Apache Rewrite注意事项
  3. 想在抖音挣钱,带你了解抖音自媒体的流量获取攻略
  4. ESP8266如何使用u8g2(I2C)驱动SH1106的OLED
  5. C3P0整体类结构简单分析
  6. (QT) QUdpSocket / 在QT中通过Winsock2实现UDP通讯
  7. python弹幕代码_使用python对隐秘的角落进行弹幕分析
  8. Nginx日志文件清理
  9. bzoj 1176 Mokia (cdq分治)
  10. 点击某个物体人机验证码java,captcha: 行为验证码(滑动拼图、点选文字),前后端(java)交互,包含h5/flutter/uni-app的源码和实现...