一、懒汉式

public classSingleton{private static Singleton instance = null;privateSingleton(){}public staticSingleton newInstance(){if(null ==instance){

instance= newSingleton();

}returninstance;

}

}

懒汉模式中单例是在需要的时候才去创建的,如果单例已经创建,再次调用获取接口将不会重新创建新的对象,而是直接返回之前创建的对象。如果某个单例使用的次数少,并且创建单例消耗的资源较多,那么就需要实现单例的按需创建,这个时候使用懒汉模式就是一个不错的选择。但是这里的懒汉模式并没有考虑线程安全问题,在多个线程可能会并发调用它的getInstance()方法,导致创建多个实例

二、饿汉式

public classSingleton{private static Singleton instance = newSingleton();privateSingleton(){}public staticSingleton newInstance(){returninstance;

}

}

从代码中我们看到,类的构造函数定义为private的,保证其他类不能实例化此类,然后提供了一个静态实例并返回给调用者。饿汉模式是最简单的一种实现方式,饿汉模式在类加载的时候就对实例进行创建,实例在整个程序周期都存在。它的好处是只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问题。它的缺点也很明显,即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。

三、懒汉加锁式

public classSingleton{private static Singleton instance = null;privateSingleton(){}public static synchronizedSingleton newInstance(){if(null ==instance){

instance= newSingleton();

}returninstance;

}

}

加锁的懒汉模式看起来即解决了线程并发问题,又实现了延迟加载,然而它存在着性能问题,依然不够完美。synchronized修饰的同步方法比一般方法要慢很多,如果多次调用getInstance(),累积的性能损耗就比较大了。

四、懒汉双重校验锁

public classSingleton {private static volatile Singleton instance = null;privateSingleton(){}public staticSingleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {

instance= newSingleton();

}

}

}returninstance;

}

}

1.为了防止new Singleton被执行多次,因此在new操作之前加上Synchronized 同步锁,锁住整个类(注意,这里不能使用对象锁)。

2.进入Synchronized 临界区以后,还要再做一次判空。因为当两个线程同时访问的时候,线程A构建完对象,线程B也已经通过了最初的判空验证,不做第二次判空的话,线程B还是会再次构建instance对象。

3.JVM编译器的指令重排会导致并发问题,所以加入volatile关键字防止指令重排

五、静态内部类

public classSingleton{

private static classSingletonHolder{

public static Singleton instance = newSingleton();

}

privateSingleton(){}

public staticSingleton newInstance(){

returnSingletonHolder.instance;

}

}

这种方式同样利用了类加载机制来保证只创建一个instance实例。它与饿汉模式一样,也是利用了类加载机制,因此不存在多线程并发的问题。不一样的是,它是在内部类里面去创建对象实例。这样的话,只要应用中不使用内部类,JVM就不会去加载这个单例类,也就不会创建单例对象,从而实现懒汉式的延迟加载。也就是说这种方式可以同时保证延迟加载和线程安全。

六、枚举

public enumSingletonEnum {

INSTANCE;

}

使用枚举实现的单例模式,不但可以防止利用反射强行构建单例对象,而且可以在枚举类对象被反序列化的时候,保证反序列的返回结果是同一对象。但是枚举模式也是饿汉式,和普通饿汉式存在同样的问题

java 单例写法_java 单例模式的几种写法相关推荐

  1. java单例方法_Java单例模式

    单例模式,是特别常见的一种设计模式,因此我们有必要对它的概念和几种常见的写法非常了解,而且这也是面试中常问的知识点. 所谓单例模式,就是所有的请求都用一个对象来处理,如我们常用的Spring默认就是单 ...

  2. java单例设计模式_Java设计模式之单例模式详解

    在Java开发过程中,很多场景下都会碰到或要用到单例模式,在设计模式里也是经常作为指导学习的热门模式之一,相信每位开发同事都用到过.我们总是沿着前辈的足迹去做设定好的思路,往往没去探究为何这么做,所以 ...

  3. java单例枚举_Java增强枚举的用例

    java单例枚举 Brian Goetz在消息" 增强枚举-用例 "中写道:"我们希望就现在实现的功能[ 增强枚举 ]获得用户反馈." 他陈述了他的消息的第一个 ...

  4. java 单例 dcl_java 中单例模式DCL的缺陷及单例的正确写法

    1 前言 单例模式是我们经常使用的一种模式,一般来说很多资料都建议我们写成如下的模式: /** * Created by qiyei2015 on 2017/5/13. */ public class ...

  5. java单例代码_java中的单例模式的代码怎么写

    单例模式在我们日常的项目中十分常见,当我们在项目中需要一个这样的一个对象,这个对象在内存中只能有一个实例,这时我们就需要用到单例. 一般说来,单例模式通常有以下几种: 1.饥汉式单例 public c ...

  6. java+单例+恶汉_Java设计模式之单例模式(恶汉式和懒汉式)

    /** 单例模式:* 饿汉式:类一加载就创建对象* 懒汉式:用的时候,才去创建对象* 面试题:单例模式的思想是什么?写一个代码体现(我们最好写懒汉式的单例模式给面 /* * 单例模式: *       ...

  7. java 单例 实现_java 实现单例的各种方式

    概述 上一篇日志中,我们介绍了单例模式的概念和基础的应用 本节中,我们就来介绍一下 java 语言中如何编写单例模式类 只适合单线程环境的单例模式 public class Singleton { p ...

  8. java 单例 性能_java程序性能优化之设计优化---单例pk

    对于单例,很多人就要问了.为什么要使用单例,单例意义何在? 单例的产生是由于类的频繁使用,每次生成对象都要new,使用完值后GC要释放对象.这样一来系统性能降低,GC承受着巨大的压力.为了能够提升系统 ...

  9. java 单例类_Java单例类

    单例类: 主要知识点: 1,单例类概念.特点 2,三种单例类懒汉,饿汉,双重加锁举例, 3,懒汉.饿汉区别以及单例类的总结: 1,概念:java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单 ...

最新文章

  1. IntelliJ IDEA 2021.1正式发布!快来看看又有哪些神仙功能加入!
  2. SAP IDoc Post不成功,报错 - A company code cannot be determined for LI 0000100061 –
  3. C#实现javascript的escape
  4. 详细的DedeCMS(织梦)目录权限安全设置教程
  5. idea如何把包变为模块_让我们将包变成模块系统!
  6. leetcode 1319. 连通网络的操作次数(并查集)
  7. LeetCode 1233. 删除子文件夹
  8. QT学习笔记(二):QT MinGW 和 MSVC 编译方式
  9. JS实现监控微信小程序
  10. Hibernate讲解(三)-类映射文件中常用属性的了解
  11. 30岁学python有前途吗-我30岁了,转行学编程可以吗? 排除法告诉你答案
  12. 常见iPhone设备尺寸及分辨率(持续更新)
  13. truffle和remix区别
  14. Diffie-hellman 密匙交换
  15. Java机器人解密游戏_解谜类游戏 篇十:在机器人的世界中,那些隐藏在谜题之下的眼泪...
  16. 阿里云国际版云服务器防火墙设置
  17. 400集高并发分布式超级电商项目实战
  18. 关于SIGHCLD和SIGCLD
  19. wlan:11a/11b/11g/11n/11ac
  20. 什么是业务对象?业务逻辑是什么?

热门文章

  1. R语言使用ggradar包可视化基本雷达图(radar chart、蜘蛛图spider plot)、可视化单个数据对象的雷达图、自定义雷达图的线条类型、线条宽度、数据点大小、色彩等
  2. R语言使用lm构建线性回归模型、并将目标变量对数化实战:可视化模型预测输出与实际值对比图、可视化模型的残差、模型系数(coefficient)、模型总结信息(summary)、残差总结信息
  3. R语言grafify包简单、快速绘制19个漂亮的统计图实战
  4. R语言match函数对象之间的匹配实战
  5. Plotly可视化输出数据表格(table):简单表格、添加链接的表格
  6. R安德森-达令检验( Anderson-Darling Test)
  7. R可视化绘制对数正态分布(Log Normal Distribution)
  8. mysql导入指定数据库_从mysql全备 导入指定数据库的数据:三种考虑方法
  9. 3d 自动生成物体_Adobe发布3D建模、AR内容生成应用Scantastic
  10. One-hot encoding的不足及改进