单例模式是设计模式中用得比较多的一种设计模式,它的主要优点有:

1.访问受控,保证访问的是唯一的实例。

2.由于只有一个实例,所以节省资源。

缺点:

灵活性低,如果对象的应用场景多变,则不适用单例模式。

1.如何实现单例模式?

1.1 懒汉模式(线程不安全)

想要实现单例,莫非就是要适用static关键字,如下声明一个对象:

public class SingleTon {private static SingleTon singleTon = null;}

这样我们就得到了一个类型为SingleTon的静态变量,接下来,我们就要控制这个类,不能被任意的new出来,这个就是实现了单例模式唯一性的根本,代码如下:

public class SingleTon {private static SingleTon singleTon = null;    //把构造函数设置为private,防止被new实例化private SingleTon() {}public static SingleTon getInstance() {//每次调用SingleTon.getInstance()时返回的都是singleTon唯一对象if( singleTon == null ) {singleTon = new SingleTon();}return singleTon;}

这种模式的单例在非并发环境下是可靠的,我们知道,我们保证类是单例的代码关键是

if(singleTon == null)

并且java中new是不具有原子性的(涉及到赋值问题),所以,在并发环境下,是可能执行了多次的new操作,造成实例非唯一性。

1.2如何解决?

为了解决问题,首先就要明白问题产生的原因:

上述懒汉产生多个实例造成单例失效的原因是在高并发环境下可能同时有2个或以上的线程访问getInstance()类方法,又因为new操作不具有原子性,所以会导致产生2个实例的问题。

因此,我们可以:

1.通过添加synchronized来修饰getInstance()方法,简单有效粗暴,但是往往暴力使用同步方法带来的问题都是一样的,就是惨重的效率代价~

2.通过添加synchronized来同步部分代码块,并且通过volatile来防止指令重排,代码如下:

public class SingleTon {private static SingleTon singleTon = null;private SingleTon() {}public static SingleTon getInstance() {if( singleTon == null ) {synchronized( SingleTon.class ) {if( singleTon == null ) {singleTon = new SingleTon();}}}return singleTon;}}

上述方法就是传说中的DCL双重检查锁定单例(JDK1.5之后的版本)

转载于:https://www.cnblogs.com/dick159/p/6601086.html

【Java单例模式】Java单例模式之懒汉模式线程安全相关推荐

  1. C++设计模式--单例模式详解(懒汉模式、饿汉模式、双重锁)

    C++设计模式--单例模式详解(懒汉模式.饿汉模式.双重锁) 应用场景 一.单例模式是什么? 二.使用步骤 1.UML图 2.代码实现 应用场景 通常我们在做通讯的时候,我们跟服务器数据交互,假如每次 ...

  2. DBCP使用BasicdataSource连接(两种单例模式-----饿汉和懒汉模式)

    DBCP使用BasicDataSource连接 BasicDataSource实现DataSource的接口,可以进行简单的数据库连接 第一种:懒汉模式:顾名思义,"懒",只有在调 ...

  3. 设计模式——单例模式之详细设计分析懒汉模式,以及懒汉模式两种同步方法

    上篇文章介绍了饿汉模式,由于懒汉模式内容多所以新写一篇介绍懒汉模式,想要看饿汉模式移步-- 懒汉模式:调用时采取创建实例 public class Singleton {private static ...

  4. java设计模式之单例模式|单例模式之饿汉模式、懒汉模式、枚举方式|最详细的6种懒汉模式详解

    目录 一.单例模式 二.饿汉模式和懒汉模式 1.饿汉模式,线程安全 2.懒汉模式 懒汉模式1,线程不安全(不常用) 懒汉模式2,线程安全(不常用) 懒汉模式3,线程安全,双重校验(不常用) 懒汉模式4 ...

  5. 【设计模式】之单例模式中的饿汉模式和懒汉模式

    本文内容:什么是单例模式,单例的作用,饿汉模式,懒汉模式的安全与非安全的实现,饿汉模式与懒汉模式的区别. 什么是单例模式? 单例模式:保证一个类,仅有一个实例.提供一个访问它的全局访问点. 单例的作用 ...

  6. Android中的单例模式(java单例模式详解,Glide,EventBus,LayoutInfalter的源码单例模式详解)

    一.单例模式 (1)单例模式介绍和定义 ​ 大概意思是保证一个类在任何时候都只有一个实例在内存里,以static形式提供整个项目的访问.在Android系统中常用的地方有:创建一个SQLiteOpen ...

  7. 2023-01-26 JS设计模式-单例模式:单例模式的原理和实现,懒汉模式和饿汉模式,单例模式实现登录框

    文章目录 1.什么是单例模式? 介绍 特点 结构 2.如何实现一个单例模式? 思路 实现代码 3.单例模式的优缺点 4.懒汉模式和饿汉模式 懒汉模式:一开始不会实例化,什么时候用才new出来实例化 饿 ...

  8. 单例模式——饿汉模式懒汉模式

    目录 一.什么是单例模式? 二.单例模式的应用场景 三.两种典型的方式实现单例模式 1.饿汉模式 2.懒汉模式 3.理解懒汉模式和饿汉模式 四.单例模式和线程的关系 1.饿汉模式是否线程安全? 2.懒 ...

  9. 单例模式的C++实现(懒汉模式和饿汉模式的详细讲解和实现)

    文章目录 前言 一.单例模式的概念 1.2单例模式的分类 1.2懒汉和饿汉的利弊 二.代码实现 1.饿汉模式 2.懒汉模式 总结 前言 提示:单例模式的出现.由于在某些场景中你最多而且必须有一个对象存 ...

最新文章

  1. Windows Mobile 7 梦幻之旅系列1之- What’s New?
  2. android数据库三个方法有哪些,一个三年Android开发的总结 - 常见数据库问题总结...
  3. 关于应用程序启动,你可能不知道的东西
  4. 分享基于分布式Http长连接框架--设计模型
  5. oracle数据库 spring,oracle spring 连接数据库 报错
  6. pmp最近5题(2022年3月23日)
  7. OSChina 周三乱弹——节前综合症来袭,简直无法抵抗了
  8. 02数据结构与算法分析之---数据的两种结构
  9. windows7 安装MySQL 解决报错 服务没有响应控制功能
  10. (九)模型驱动和属性驱动
  11. sql去重、or、in、and、groupby的使用
  12. 使用jsPlumb插件实现动态连线功能
  13. Infor 成功举办 Infor Next China
  14. 基于windows fiber的协程(coroutine)实现
  15. 关于过渡矩阵和坐标变换公式的思考
  16. linux mysql.sock文件_关于linux上mysql.sock文件的个人理解
  17. 一IT公司hr对软件外包感受(转)
  18. IOS塔防游戏《坦克对大炮》的开发设计记录
  19. 表格怎么拆分成2个的简便操作
  20. 《我的职场十年》-读后感-Pete的启示

热门文章

  1. ABAP和Java的destination和JNDI
  2. c语言exit_C语言实现2048
  3. 有效的括号Python解法
  4. android实现自动抢红包,Android手机辅助功能实现自动抢微信红包功能
  5. lass翻译_【专题讲座】政务翻译人才培训系列讲座(1)
  6. tomcat怎么平滑更新项目_tomcat_deploy 平滑启动脚本
  7. 联想e52进入bios_联想笔记本怎么设置u盘启动|联想笔记本bios设置usb启动步骤
  8. fat32 linux 打包工具_11款最棒的Linux数据恢复工具发布啦!
  9. 12个超炫数据可视化工具_Python5个数据可视化工具
  10. double类型最大值_Java后端精选基础教程:Java 中的基本数据类型「连载 6」