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

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

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

缺点:

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

如何实现单例模式?

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之后的版本)

Java单例模式之懒汉模式线程安全的更多相关文章

  1. java 单例模式-饿懒汉模式

    单例-饿汉模式 1.将构造方法私有化,不允许外部直接创建对象 private Singleton(){}2.自己在类的内部创建一个唯一实例 private static Singleton insta ...

  2. 单例模式之懒汉模式,懒汉模式之高效模式,DLC双判断模式

    import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; imp ...

  3. 瞎扯设计模式1:单例模式 饿汉模式 懒汉模式 线程安全的单例 singleton 设计模式 java

    [原创声明]此文为本人原创,欢迎转载,转载请注明出处,作者链接~ http://www.cnblogs.com/m-yb/p/8833085.html 单例很常用,面试也经常被问,如:不用自定义锁怎么 ...

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

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

  5. java里的 懒汉和恶汉模式-----讲解

    ------------java中的恶汉模式 public void Test{ private static Test inte = new Test(); // 内部自己创建好实例,私有属性(不建 ...

  6. Java单例模式(Singleton)以及实现

    一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必须创建 ...

  7. Java 设计模式之单利模式

    一.首先介绍一下单例模式:     单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局 ...

  8. Java单例模式实现,一次性学完整,面试加分项

    单例模式是设计模式中使用最为普遍的一种模式.属于对象创建模式,它可以确保系统中一个类只产生一个实例.这样的行为能带来两大好处: 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而 ...

  9. java单例模式总结

    目录 一. 饿汉模式(静态初始化) 二.双重检查锁(dcl) 三. 延迟占位类 四.枚举实现 最后 常见安全的单例实现代码和自己的一点理解. 一. 饿汉模式(静态初始化) class Singleto ...

随机推荐

  1. React生命周期简单详细理解

    前言 学习React,生命周期很重要,我们了解完生命周期的各个组件,对写高性能组件会有很大的帮助. Ract生命周期 React 生命周期分为三种状态 1. 初始化 2.更新 3.销毁 初始化 1.g ...

  2. Apache HTTP 服务器 2.4(又名httpd)安装\配置 \启动

    Apache HTTP 服务器 2.4 源文档  

  3. fiddler 一些不为人知的功能

    1. fiddler的ctrl+F查找功能 可以进行正则表达式查找: 勾选Regular Expression,find中出现REGEX:,在这后面输入正则表达式即可进行匹配查找 2. fiddler ...

  4. windows下配置maven

    首先下载好maven的压缩包,然后解压到某个目录下,我解压到了D盘 打开readme.txt 1.2步已经完成,第3步的意思是让我们把bin所在的路径添加到系统变量的path中去 第4步意思是确保的你 ...

  5. 详细说明进程管理工具htop、vmstat等相关命令

    htop htop是一款运行于Linux系统监控与进程管理软件,用于取代Unix下传统top.与top只提供最消耗资源进程列表不同,htop提供所有进程的列表,并且使用彩色标识出处理器.swap和内存 ...

  6. 523. Continuous Subarray Sum

    class Solution { public: bool checkSubarraySum(vector<int>& nums, int k) { unordered_map&l ...

  7. [双硬盘GPT分区安装linux] ----安装

    最近机器学习课程需要用到pytorch, 基于cuda8的pytorch的需要,最终决定还是要安装一个linux系统在我的windows10机器上.本篇记录安装过程备用. 本人笔记本是联想Y520,系 ...

  8. [Java] 基本資料包裝類別 Wrapper Classes

    基本型別包裝 (Wrapper Classes) 將基本型別生成物件,要將基本型別先包裝成物件,才能執行生成, Boxing: Integer a = new Integer(1) Unboxing: ...

  9. db2 varchar字段类型太大问题

    [DB2]SQL1585N 由于没有具有兼容页面大小的可用系统临时表空间,因此无法创建临时表.SQLSTATE=54048 自己写了一段SQL,SQL中包含ORDER BY 字句,但是在执行的时候报错 ...

  10. gcc and g++ 常用参数解释

    程序编译运行的过程 预处理.处理一些#include,#define命令,生成.i或者.ii文件: 编译.编译器进行语法分析,语义分析,中间代码生成,目标代码生成,优化,生成.s文件 汇编.汇编器把汇 ...