使用前提:

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

三要素:

  • 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. ioi2018集训队自选题:最短路练习题

    题意:链接 定义pos[i]表示i这个值在数组里的下标. 我们先用单调栈找到每个元素左边和右边第一个比它大的元素$l_i$和$r_i$,然后建一棵二叉树,我们就叫做maxtree吧 (upd:mdzz ...

  2. 洛谷P2680 运输计划

    大概就是二分+树上差分... 题意:给你树上m条路径,你要把一条边权变为0,使最长的路径最短. 最大的最小,看出二分(事实上我并没有看出来...) 然后二分k,对于所有大于k的边,树上差分求出最长公共 ...

  3. selectionStart和selectionEnd属性

    在网上看了很多用js在光标处插入文字的代码,很多都没有用,互抄而已,浪费时间.最近用到一个新方法,可以到达这个需求.IE支持document.selection,Firefox,Chrome,Safa ...

  4. 浏览器中输入URL发生了什么

    浏览器中输入URL会发生什么呢?这是我们经常会问到的一个问题. 我们知道的都是会发送http请求,服务端会处理请求给我们响应的结果,浏览器会渲染html 页面 但其实会遗漏掉一些比较重要的东西.下面的 ...

  5. The 2016 ACM-ICPC Asia Beijing Regional Contest E - What a Ridiculous Election

    https://vjudge.net/contest/259447#problem/E bfs,k个限制条件以数组的额外k维呈现. #include <bits/stdc++.h> usi ...

  6. 将make的输出重定向到文件(转)

    原文:将make的输出重定向到文件 [用法] 1.想要把make输出的全部信息,输出到某个文件中,最常见的办法就是:make xxx > build_output.txt此时默认情况是没有改变2 ...

  7. (大数 string) Integer Inquiry hdu1047

    Integer Inquiry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. xargs与exec详解

    一.场景 这个命令是错误的 1 find ./ -perm +700 |ls -l 这样才是正确的 1 find ./ -perm +700 |xargs ls -l  二.用法 1 2 3 4 5 ...

  9. Python基础【day03】:字符转编码操作(五)

    本节内容 1.编码介绍 2.字符编码介绍 3.总结 说到python的编码,一句话总结,说多了都是泪啊,这个在以后的python的开发中绝对是一件令人头疼的事情.所以有必要要讲讲清楚 一.编码介绍 1 ...

  10. Dubbo协议

    参考dubbo官方文档http://dubbo.apache.org/zh-cn/docs/user/references/protocol/dubbo.html dubbo共支持如下几种通信协议: ...