Java单例模式之懒汉模式线程安全
单例模式是设计模式中用得比较多的一种设计模式,它的主要优点有:
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单例模式之懒汉模式线程安全的更多相关文章
- java 单例模式-饿懒汉模式
单例-饿汉模式 1.将构造方法私有化,不允许外部直接创建对象 private Singleton(){}2.自己在类的内部创建一个唯一实例 private static Singleton insta ...
- 单例模式之懒汉模式,懒汉模式之高效模式,DLC双判断模式
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; imp ...
- 瞎扯设计模式1:单例模式 饿汉模式 懒汉模式 线程安全的单例 singleton 设计模式 java
[原创声明]此文为本人原创,欢迎转载,转载请注明出处,作者链接~ http://www.cnblogs.com/m-yb/p/8833085.html 单例很常用,面试也经常被问,如:不用自定义锁怎么 ...
- java 设计模式 单例模式之饿汉模式/懒汉模式 singleton pattern
https://v.qq.com/x/page/e0364ung5zp.html 讲的不错, 关于 饿汉式单例模式 code Student 类: package com.test;//单例模式之 ...
- java里的 懒汉和恶汉模式-----讲解
------------java中的恶汉模式 public void Test{ private static Test inte = new Test(); // 内部自己创建好实例,私有属性(不建 ...
- Java单例模式(Singleton)以及实现
一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必须创建 ...
- Java 设计模式之单利模式
一.首先介绍一下单例模式: 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局 ...
- Java单例模式实现,一次性学完整,面试加分项
单例模式是设计模式中使用最为普遍的一种模式.属于对象创建模式,它可以确保系统中一个类只产生一个实例.这样的行为能带来两大好处: 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而 ...
- java单例模式总结
目录 一. 饿汉模式(静态初始化) 二.双重检查锁(dcl) 三. 延迟占位类 四.枚举实现 最后 常见安全的单例实现代码和自己的一点理解. 一. 饿汉模式(静态初始化) class Singleto ...
随机推荐
- Gym101889J. Jumping frog(合数分解+环形dp预处理)
比赛链接:传送门 题目大意: 一只青蛙在长度为N的字符串上跳跃,“R”可以跳上去,“P”不可以跳上去. 字符串是环形的,N-1和0相连. 青蛙的跳跃距离K的取值范围是[1, N-1],选定K之后不可改 ...
- HTML下标签之应用
<!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...
- 陈斌python语言基础与应用00
软件改变生活:购物.餐饮.商旅出行.资料查找... Everybody in this country should learn how to program a computer...because ...
- Vue2.5学习路线及基础知识总结。
在接触新技术不了解时,我喜欢去慕课网上看新手教程,在学习vue时,在慕课网上看了几个老师的视频,发现这挺好,讲到挺详细的,适合新手,有兴趣的可以先看一下,vue2.5入门教程. 然后在学习路上看见了一 ...
- HDU 2176:取(m堆)石子游戏(Nim博弈)
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- Spock - Document -01- introduction & Getting Started
Introduction Peter Niederwieser, The Spock Framework TeamVersion 1.1 Spock is a testing and specific ...
- socket端口绑定后通过bat干掉
@echo off::port为需要去绑定端口set port=8888for /f "tokens=5 delims= " %%a in ('netstat -ano ^|fin ...
- robot framework类型强制转换
在测试过程中需要比较两个数值是否存在一定的关系 1.若新增一个数据,删除一个数据,判断他是否新增成功或者删除成功,除了判断本身数据成功显示与不显示之外,可以通过总数间接去判断是否成功 A)新增删除前获 ...
- maven无法下载oracle驱动包
由于版权问题,在中央仓库是没有oracle的jdbc驱动的,可以手动下载到本地或者在oracle安装目录的jdbc目录中找到对应的jar,然后通过以下命令安装到本地仓库 mvn install:ins ...
- DEV中的TreeList控件应用的一个小效果实现——个人总结
我使用最多的DEV控件就是这个TreeList啦,当然用好它很不简单,如果用好它,能做出很精彩的树形层次结构图.TreeList控件很强大,以至于你看DEV自带的DEMO,也得浪费你很长时间应用.DE ...