一.什么是单例以及单例的使用场景就不多说了,不清楚的可以看我上篇文章或者自行查找

二.单例和多并发之间的规则

单例就是只能创建一个实例对象,而多并发情况下如果不处理一下单例的写法很难保证只创建一个实例对象,所以后面会出问题

处理的思路:在创建对象的时候使用同步锁,或者直接懒人做法---放一个静态的实例对象

三.几种常见的单例模式的写法

1.最常规的(线程不安全--不支持多并发)

public class Singleton {//一个静态的实例private static Singleton singleton;//私有化构造函数private Singleton(){}//给出一个公共的静态方法返回一个单一实例public static Singleton getInstance(){if (singleton == null) {singleton = new Singleton();}return singleton;}

2.上面的常用的是不支持并发的,所以后面考虑在方法上加同步锁,但是如果在上面那个获取对象的方法上加锁则会每次在获取对象时都需要等待,蛮费时间的,所以不能这么玩,

可以使用如下方法内部类写法(其实我感觉他和饿汉式差不多,都是new一个静态实例放在那里)

public class Singleton {/* 私有构造方法,防止被实例化 */private Singleton() {}/* 此处使用一个内部类来维护单例 */private static class SingletonFactory {private static Singleton instance = new Singleton();}/* 获取实例 */public static Singleton getInstance() {return SingletonFactory.instance;}}
备注:
第一次调用getInstance的时候,JVM能够帮我们保证instance只被创建一次,并且会保证把赋值给instance的内存初始化完毕,因为JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的可以对比一下饿汉式写法:
public class Singleton {private static Singleton instance = new Singleton();private Singleton() { }public static Singleton getInstance() {return instance; }
}

3.或者在创建类的那个时刻同步就行,获取对象的方法就不同步(和懒汉式类似,需要时加载就行)

public class SingletonTest {private static SingletonTest instance = null;private SingletonTest() {}private static synchronized void syncInit() {if (instance == null) {instance = new SingletonTest();}}public static SingletonTest getInstance() {if (instance == null) {syncInit();}return instance;}
}懒汉式的不高效写法,相当于也是同步了获取对象的方法
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

4.所谓的双重锁写法(相当于变相的在类的创建时加同步锁,和方法三原理类似或者和方法二内部类利用jvm类加载机制类似)

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

转载于:https://www.cnblogs.com/feichen-66/p/11195818.html

支持多并发的单例有哪几种写法相关推荐

  1. vue单文件props写法_详解Vue 单文件组件的三种写法

    详解Vue 单文件组件的三种写法 JS构造选项写法 export defaul { data, methods, ...} JS class写法 @Component export default c ...

  2. 单例模式及单例类的两种实现

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在 ...

  3. php 恶汉单例,单例模式的两种方式(恶汉式,懒汉式)

    单例模式的两种形式(恶汉式,懒汉式) 单例模式的特点:解决了一个类在内存的唯一性,这个类的对象只有一个. 写单例模式的步骤: 1. 私有修饰构造方法 2. 在本类的成员位置, new 自己类的对象 3 ...

  4. java线程安全定义了什么单例_Java中四种线程安全的单例模式实现方式

    第一种:饿汉模式(线程安全) public class Single2 { private static Single2 instance = new Single2(); private Singl ...

  5. 为什么我强烈建议大家使用枚举来实现单例

    转载自   为什么我墙裂建议大家使用枚举来实现单例 关于单例模式,我的博客中有很多文章介绍过.作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单.因为在设计单例的时候要考虑很多问题, ...

  6. 为什么我墙裂建议大家使用枚举来实现单例。

    关于单例模式,我的博客中有很多文章介绍过.作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单.因为在设计单例的时候要考虑很多问题,比如线程安全问题.序列化对单例的破坏等. 单例相关文 ...

  7. 静态内部类实现单例_单例模式详解

    概述 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,使用单例模式的类只有一个对象实例. 单例应用场景 Windows系统的任务管理器. ...

  8. Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:爱宝贝丶 my.oschina.net/zhangxufen ...

  9. Redis 单例、主从模式、sentinel 以及集群的配置方式及优缺点对比(转)

    摘要: redis作为一种NoSql数据库,其提供了一种高效的缓存方案,本文则主要对其单例,主从模式,sentinel以及集群的配置方式进行说明,对比其优缺点,阐述redis作为一种缓存框架的高可用性 ...

最新文章

  1. 微软低调发布 Web 版本的 Visual Studio Code 预览
  2. 梯度下降算法到logistic回归
  3. juc是什么java_JUC简介
  4. 程序员职业生涯的11个阶段程序人生
  5. Java-基本运算符
  6. Java CompletableFuture
  7. python中ndarray对象实例化_Python —— 实例化ndarray对象
  8. HTML5 -canvas拖拽、移动 绘制图片可操作移动,拖动
  9. 暨南大学人文社科a类期刊_关于调整人文社科B类和C类期刊目录的通知
  10. ​LeetCode刷题实战507:完美数
  11. ASP.NET选择题部分集合
  12. mac上安装brew(最简易)
  13. 信息系统规划方法-战略目标集转化法(SST)
  14. 成长的思考:如何在工作中保持高速的自我成长
  15. 心灵鸡汤1------让人奋进的五句话
  16. 色彩心理学(转载)以后也许有用~
  17. 极限中0除以常数_考研数学极限重难点讲解003期【无穷小量和无穷大量】
  18. ios wallet开发_iOS Wallet 开发
  19. Jenkins:設定一次後就很方便的排程工具
  20. 电灯开关-第12届蓝桥杯Scratch省赛2真题第1题

热门文章

  1. 轻量高效的开源JavaScript插件和库 【转】
  2. 【Javascript 拾遗之三】Closure 闭包
  3. 算法:输入一个链表,输出该链表中倒数第k个结点。
  4. 对于最近爆火的区块链,投资人怎么看? | 聚焦
  5. C#递归搜索指定目录下的文件或目录
  6. 【iOS7一些总结】9、与列表显示(在):列表显示UITableView
  7. Map实现之HashMap(结构及原理)(转)
  8. Android中实时视频传输(摄像头实时视频传输)解决方案二
  9. Android 调用分享框
  10. ehcache memcache redis 三大缓存男高音