使用前提:

  需要频繁的进行创建和销毁的对象,创建对象时耗时过多或耗费资源过多

三要素:

  • 1、构造方法私有化;
  • 2、实例化的变量引用私有化;
  • 3、获取实例的方法共有。

1.饿汉式单例

  弊端:在类装载的时候就完成实例化

/**
* 饿汉式单例
*
* @author Wonder
* @history create Wonder 2018年10月24日 上午9:55:32
* @version 1.0
*/
public class Singleton1 {
private Singleton1() {
}// 1私有化构造 private final static Singleton1 singleton1 = new Singleton1();// 2实例化 public static Singleton1 getInstance() {// 3对外提供
return singleton1;
} }

2.懒汉式单例

  弊端:多线程环境下会产生多个single对象,线程不安全

/**
* 懒汉式单例
* 多线程环境下会产生多个single对象
*
* @author Wonder
* @history create Wonder 2018年10月24日 上午10:17:59
* @version 1.0
*/
public class Singleton2 {
private Singleton2() {
}// 1私有化构造 private static Singleton2 singleton2 = null;// 延迟实例 public static Singleton2 getInstance() {
if (singleton2 == null) {
singleton2 = new Singleton2();
}
return singleton2;
}
}

3.懒汉式单例(synchronized同步锁)

  弊端:效率低

    同步方法的方式:获取实例时,每次都要执行同步方法,效率太低

    同步代码块的方式:可能多个线程同时进入if判断,实际页无法起到线程同步的作用

/**
* 懒汉式单例 只对需要锁的代码部分加锁
*
* @author Wonder
* @history create Wonder 2018年10月24日 上午10:17:59
* @version 1.0
*/
public class Singleton4 {
private Singleton4() {
}// 1私有化构造 private static Singleton4 single = null;// 延迟实例 public static Singleton4 getInstance() {
if (single == null) {
synchronized (Singleton4.class) {
single = new Singleton4();
}
}
return single;
}
}

4.双重检查

  1.使用volatile关键字,防止防止 JVM 进行指令重排优化

  2.进行了两次if (singleton == null)检查,如果为null,同步代码块,创建实例,否则直接返回singleton实例

public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}

5.静态代码块和静态内部类

  静态代码块的方式

public class Singleton5 {
private Singleton5() {
}// 1私有化构造 private static Singleton5 single = null;// 延迟实例 // static静态代码块
static {
single = new Singleton5();
} public static Singleton5 getInstance() {
return single;
}
}

  静态内部类方式更优(懒加载)

    静态内部类方式在Singleton类被装载时并不会立即实例化

public class Singleton {

    private Singleton() {}

    private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
} public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}

6.枚举实现

  简单枚举方式:

public enum Singleton {
INSTANCE;
public void whateverMethod() { }
}

  优化:内部枚举类

public class SingletonFactory {

    // 内部枚举类
private enum EnmuSingleton {
SINGLETON;
private Singleton6 single; // 枚举类的构造方法在类加载是被实例化
private EnmuSingleton() {
single = new Singleton6();
} public Singleton6 getInstance() {
return single;
} } public static Singleton6 getInstance() {
return EnmuSingleton.SINGLETON.getInstance();
}
} class Singleton6 {
public Singleton6() {
}
}

单例模式(懒汉、饿汉、同步锁、static、枚举)实现的更多相关文章

  1. java 设计模式 单例模式之饿汉模式/懒汉模式 singleton pattern

    https://v.qq.com/x/page/e0364ung5zp.html 讲的不错, 关于 饿汉式单例模式 code Student 类: package com.test;//单例模式之   ...

  2. C++的单例模式与线程安全单例模式(懒汉/饿汉)

    1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实 ...

  3. Java单例模式之饿汉模式与懒汉模式

    单例模式是我们在开发软件的过程中经常用到的23中常用的java模式之一,主要的功能就是保证我们所使用的对象只有一个,这也在一方面减少了出错的可能性,增强了代码的健壮.单例模式一般来说有两种实现的方式, ...

  4. javascript单例模式(懒汉 饿汉)

    第一种:懒汉模式 var Singleton=(function(){ var instantiated; //比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢 functi ...

  5. java单例,懒汉&饿汉

     * 单例模式Singleton  * 应用场合:有些对象只需要一个就足够了,如皇帝  * 作用: 保证整个应用程序中某个实例有且只有一个  * 区别: 饿汉模式的特点是加载类时比较慢,但运行是比较快 ...

  6. java基础---Java---面试题---银行业务调度系统(线程同步锁、枚举、线程池)

    银行业务调度系统的项目需求:   模拟实现银行业务调度系统逻辑,具体需求如下:   Ø 银行内有6个业务窗口,1- 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口.   Ø 有三种对应类 ...

  7. java基础10 单例模式之饿汉式和懒汉式单例

    前言: 软件行业中有23中设计模式 单例模式    模版模式    装饰者模式    观察者模式    工厂模式    ........... 单例模式 1. 单例模式包括 1.1 饿汉式单例 1.2 ...

  8. java单例模式(饿汉式和懒汉式)

    1 /* 2 * 设计模式:对问题行之有效的解决方式.其实它是一种思想. 3 * 4 * 1,单例设计模式 5 * 解决的问题:就是可以保证一个类在内容中的对象唯一性. 6 * 7 * 必须对于多个程 ...

  9. Java面试题之在多线程情况下,单例模式中懒汉和饿汉会有什么问题呢?

    懒汉模式和饿汉模式: public class Demo { //private static Single single = new Single();//饿汉模式 private static S ...

  10. Spring中单例模式中的饿汉和懒汉以及Spring中的多例模式

    链接:https://pan.baidu.com/s/1wgxnXnGbPdK1YaZvhO7PDQ 提取码:opjr 单例模式:每个bean定义只生成一个对象实例,每次getBean请求获得的都是此 ...

随机推荐

  1. CF294C Shaass and Lights

    题目大意: 有n盏灯,(0<=n<=1000),有m盏已经点亮,每次只能点亮与已经点亮的灯相邻的灯,求总方案数,答案对1e9+7取模 第一行:两个整数n,m表示灯的总数和已点亮的灯的数目 ...

  2. PHP去调用jenkins

    背景说明:目前公司用到 jenkins(持续集成开源工具)更多情况下,通过配置,可以在gitlab上通过webhooks去调度jenkins 或者通过 jenkins管理后台,去手动执行“立即构建”去 ...

  3. Markdown语法整理

    标题 语法格式:'#'+'空格'+'文本',一共6级 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 斜体 语法格式:1个星号包裹,我 ...

  4. Linux command ------ vi / vim

    EDIT mode to GENERAL mode: press ESC General mode: operate file :q!    :force to close the file but ...

  5. ubuntu14安装node0.12.7

    1. 官网下载linux系统二进制文件, 链接如下: https://nodejs.org/ 2. 解压到/opt/目录 3. 设置node环境变量 export NODE_HOME=/opt/nod ...

  6. Prometheus jvm_exporter监控zookeeper

    Zookeeper Prometheus 监控zookeeper使用jvm_exporter来采集数据,jvm_exporter是一个可以配置抓取和暴露JMX目标的mBeans的收集器. 下载java ...

  7. 【CSS】元素样式

    1.使用CSS的三种方式: 方式一.通过元素的style属性来设置元素的样式 方式二.在HTML头部标签<head>中通过<link>标签引入一个外部的CSS资源,通常是一个C ...

  8. GoLang基础数据类型-切片(slice)详解

    GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...

  9. Kanboard简单的可视化任务板,项目管理

    采用docker安装 简单快捷 下载 docker pull kanboard/kanboard:latest 运行 docker run -d --name kanboard -p 10080:80 ...

  10. ThinkPHP 3.2 vendor()方法的深入研究及Phpqrcode的正确扩展

    ThinkPHP vendor 方法导入第三方类库 第三方类库 第三方类库指除了 ThinkPHP 框架.应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 Smarty.Zend 等系统的类 ...