饱汉模式(懒汉模式)

 // 饱汉// 非线程安全public class Singleton1 {private static Singleton1 singleton = null;private Singleton1() {}public static Singleton1 getInstance() {if (singleton == null) {singleton = new Singleton1();}return singleton;}}

优点:懒加载启动快,资源占用小,使用时才实例化,无锁。

缺点:非线程安全。

饱汉模式(懒汉模式)–线程安全

 public class Singleton {/*** 定义一个变量来存储创建好的类实例*/private static Singleton uniqueInstance = null;/*** 私有化构造方法,好在内部控制创建实例的数目*/private Singleton(){}/*** 定义一个方法来为客户端提供类实例* @return 一个Singleton的实例*/public static synchronized Singleton getInstance(){//判断存储实例的变量是否有值if(uniqueInstance == null){//如果没有,就创建一个类实例,并把值赋值给存储类实例的变量uniqueInstance = new Singleton();}//如果有值,那就直接使用return uniqueInstance;}/*** 示意方法,单例可以有自己的操作*/public void singletonOperation(){//功能处理}/*** 示意属性,单例可以有自己的属性*/private String singletonData;/*** 示意方法,让外部通过这些方法来访问属性的值* @return 属性的值*/public String getSingletonData(){return singletonData;}}

优点:同上,但加锁了。

缺点:synchronized 为独占排他锁,并发性能差。即使在创建成功以后,获取实例仍然是串行化操作。

饱汉模式(懒汉模式)–双重加锁检查DCL(Double Check Lock)

public class Singleton {/*** 对保存实例的变量添加volatile的修饰*/private volatile static Singleton instance = null;private Singleton(){}public static Singleton getInstance(){//先检查实例是否存在,如果不存在才进入下面的同步块if(instance == null){//同步块,线程安全的创建实例synchronized(Singleton.class){//再次检查实例是否存在,如果不存在才真的创建实例if(instance == null){instance = new Singleton();}}}return instance;}}

优点:懒加载,线程安全。

注:实例必须有 volatile 关键字修饰,其保证初始化完全。

饿汉模式

public class Singleton {//4:定义一个静态变量来存储创建好的类实例//直接在这里创建类实例,只会创建一次private static Singleton instance = new Singleton();//1:私有化构造方法,好在内部控制创建实例的数目private Singleton(){}//2:定义一个方法来为客户端提供类实例//3:这个方法需要定义成类方法,也就是要加static//这个方法里面就不需要控制代码了public static Singleton getInstance(){//5:直接使用已经创建好的实例return instance;}}

优点:饿汉模式天生是线程安全的,使用时没有延迟。

缺点:启动时即创建实例,启动慢,有可能造成资源浪费。

Holder模式(推荐)

public class Singleton {/*** 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载*/private static class SingletonHolder{/*** 静态初始化器,由JVM来保证线程安全*/private static Singleton instance = new Singleton();}/*** 私有化构造方法*/private Singleton(){}public static  Singleton getInstance(){return SingletonHolder.instance;}}

优点:将懒加载和线程安全完美结合的一种方式(无锁)。(推荐)

备注:

  1. 全局共享,独一份;

  2. 构造函数不暴露(如果暴露便不能保证一份),自己负责自己的构造;

  3. 懒汉式:Lazy load,用到才加载,非线程安全。如何保证线程安全呢:

(1) synchronized getInstance()。

(2)双重检查加锁(volatile)。

  1. 饿汉式:一开始就申请好,浪费了点资源,但其线程安全。

  2. Holder模式:

(1)改成内部类,由JVM保证线程安全性。

java单例模式(Holder模式美滋滋)相关推荐

  1. java单例模式恶汉模式_单例模式之懒汉模式恶汉模式

    单例模式,其实就是对于一个类,只能新建一个对象,不能有多个重复的对象.这样使得在程序在运行时,比如日志加载时能找到唯一的对象,以至正确匹配.就类似于一山不能有二虎一样.主要的思想其实就是运用stati ...

  2. 《JAVA与模式》26天系列—第12天—享元模式=单例模式+工厂模式+合成模式

    享元模式=单例模式+工厂模式+合成模式 单例模式: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 结构图: 注意多线程的单例. package com.bankht.Flyweight.co ...

  3. Java 单例模式探讨

    以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...

  4. java单例模式 三种_三种java单例模式概述

    在java语言的应用程序中,一个类Class只有一个实例存在,这是由java单例模式实现的.Java单例模式是一种常用的软件设计模式,java单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种.下 ...

  5. Java单例模式及开发应用场景

    一.Java单例模式是什么? 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该由人来控制,而应该由代码来限制,强制单例. 二.为什么要用单例模式? 单例有其独有的使用场景,一般是对于那些业 ...

  6. Java单例模式个人总结(实例变量和类变量)

    Java单例模式 背景知识:Static关键字. 在对于定义类的变量,分为两种,是否具有static修饰的变量: 没有static修饰的变量,通过类的实例化(对象)引用,改变量称为实例变量: 使用st ...

  7. 单例模式 之 单例模式——Holder

    之前我写过 单例模式中的饿汉模式和懒汉模式 他们虽然都能实现单例模式 但是优缺点很明显 饿汉模式:不能懒加载(类加载就会被实例化),消耗很大,在并发情况下安全性很高. 懒汉模式:能实现懒加载,但是在并 ...

  8. java消费者模式_基于Java 生产者消费者模式(详细分析)

    生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...

  9. Java单例模式:为什么我强烈推荐你用枚举来实现单例模式

    写在前面--原作的这篇文章真的写的非常的简洁,逻辑清晰,将Java单例模式的各种写法写的非常清楚,并介绍了用枚举实现单例的最佳实践. 单例模式简介 单例模式是 Java 中最简单,也是最基础,最常用的 ...

最新文章

  1. HTML5 实现手机拍照上传
  2. leetcode算法题--地图中的最高点
  3. 想要做服务类APP,先来看看独立商城系统开发方案
  4. 我去,剑桥硕士重委员会可还行~我颤抖地拿起了ethz的课程描述
  5. 分享到facebook链接原格式_神马?!你还不知道Facebook广告怎么操作?
  6. P3332 [ZJOI2013]K大数查询(整体二分做法)
  7. java maven 项目依赖关系,java – 关于依赖关系共享的Maven多模块项目组合
  8. 技术动态 | 知识图谱的策展
  9. security中常用的加密算法
  10. 【Python成长之路】python并发学习:多进程与多线程的用法及场景介绍
  11. java错误页面_java自定义错误页面实现方法
  12. .net winform 的 OnKeyDown 与 方向键
  13. 垃圾分类急上头?物联网卡来消愁
  14. windows安装使用programer dvorak
  15. 卡特兰数(Catalan UVa 991 10303 10007 1478)[11]
  16. 清华大学计算机专业辅修课程,清华大学计算机应用专业-辅修专业
  17. 计算机桌面图标有双影,win7图标重影怎么办_win7电脑桌面图标有重影如何解决
  18. Java实现 谁不爱打牌
  19. 为什么Windows系统磁盘盘已使用空间大小与磁盘中总文件大小不符?
  20. VS提示无可用源,此模块的调试信息…

热门文章

  1. python 灰度改二值_python实现图片二值化及灰度处理方式
  2. python numpy 图片 pad 参数详解
  3. 《一代大商孟洛川》经典台词
  4. process.env详解
  5. 2021年WordPress博客装修美化(一)
  6. 让你的专属博客更加漂亮
  7. C# datagridview CheckBox勾选问题
  8. 原装世嘉土星手柄(Sega Saturn)转USB小板,软硬件全开源
  9. ANSYS FLUENT瞬态模拟动画制作
  10. 基于vue-grid-layout的自定义布局桌面