DCL实现多线程安全的高性能懒汉模式
DCL实现多线程安全的高性能懒汉模式
1.单线程安全的懒汉模式实现
源码:
private static LazyLoad instance = null;
public static LazyLoad getInstance() {
if (instance == null)
instance = new LazyLoad();
return instance;
}
2.多线程下低性能的懒汉模式(使用synchronized修饰方法)
private static LazyLoad instance = null;
/*使用synchronized修饰的静态方法*/
public static synchronized LazyLoad getInstance() {
if (instance == null)
instance = new LazyLoad();
return instance;
}
为什么说这个方法是低性能的呢:
- synchronized同步的方法是静态的,会导致进入该方法是JVM会锁定LazyLoad这个类
解决方法:从上面可以看出只有lazyLoad==null时才需要初始化lazyLoad,而对象存在时只需要返回即可,并且return lazyLoad这个方法一定是线程安全的
3.基于DCL双锁机制的懒汉模式
源码:
public class LazyLoad{
private static LazyLoad instance = null;
/*私有化静态方法*/
private LazyLoad(){
super();
}
/*DCL双锁机制*/
public static synchronized LazyLoad getInstance() {
/*对象为空,锁定当前对象*/
if (instance == null) {
synchronized (LazyLoad.class) {
/**/
if (instance == null) {
instance = new LazyLoad();
}
}
}
/*对象不为空时直接返回对象,不使用synchronized*/
return instance;
}
}
到这里基本安全的DCL双锁机制实现高性能懒汉模式;在真实应对有JVM指令重排的多线程情况下;还需将instance使用volidate进行修饰;
private static volatile LazyLoad instance = null;
关于更多指令重排和JVM下volatile的使用请参考
好了,关于锁和懒汉模式就到这里了 ;
DCL实现多线程安全的高性能懒汉模式的更多相关文章
- java 开发中经常问到得懒汉模式 (单利模式)
//懒汉模式 class Single { public static Single s = null; public Single (){} public static Single getInst ...
- Java单例模式之懒汉模式线程安全
单例模式是设计模式中用得比较多的一种设计模式,它的主要优点有: 1.访问受控,保证访问的是唯一的实例. 2.由于只有一个实例,所以节省资源. 缺点: 灵活性低,如果对象的应用场景多变,则不适用单例模式 ...
- java 单例模式之线程安全的饿汉模式和懒汉模式
转载博主:thankyou https://blog.csdn.net/twj13162380953/article/details/53869983 理解: 饿汉式获取实例的步骤简单所以线程更安全. ...
- java 设计模式 单例模式之饿汉模式/懒汉模式 singleton pattern
https://v.qq.com/x/page/e0364ung5zp.html 讲的不错, 关于 饿汉式单例模式 code Student 类: package com.test;//单例模式之 ...
- Java-设计模式-单例模式-饿汉模式、懒汉模式
//-------------------------------------------------------------饿汉模式--开始----------------------------- ...
- java 单例模式-饿懒汉模式
单例-饿汉模式 1.将构造方法私有化,不允许外部直接创建对象 private Singleton(){}2.自己在类的内部创建一个唯一实例 private static Singleton insta ...
- Java单例模式之饿汉模式与懒汉模式
单例模式是我们在开发软件的过程中经常用到的23中常用的java模式之一,主要的功能就是保证我们所使用的对象只有一个,这也在一方面减少了出错的可能性,增强了代码的健壮.单例模式一般来说有两种实现的方式, ...
- java双重检测或枚举类实现线程安全单例(懒汉模式)
双重检测实现 /** * 懒汉模式->双重同步锁单例模式 */ public class SingletonExample5 { private SingletonExample5() { } ...
- 单例设计模式Singleton之懒加载模式(懒汉模式)【原】
单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...
随机推荐
- SQL的3个主要组成
SQL语言包含3个部分:数据定义语言(DDL),数据操作语言(DML),数据控制语言(DCL) 数据定义语言(DDL) 数据定义语言用于定义和管理对象,例如数据库.数据表及视图等.典型代表有CREAT ...
- JS中深拷贝数组、对象、对象数组方法(转载)
我们在JS程序中需要进行频繁的变量赋值运算,对于字符串.布尔值等可直接使用赋值运算符 “=” 即可,但是对于数组.对象.对象数组的拷贝,我们需要理解更多的内容. 首先,我们需要了解JS的浅拷贝与深拷贝 ...
- react native android 真机调试
http://localhost:8081/index.android.bundle?platform=android 晕死,设备掉线了 C:\Users\ZHONGZHENHUA\.android\ ...
- 高性能Web服务器Nginx的配置与部署研究(3)Nginx请求处理机制
1. 处理什么样的请求 处理访问到 Nginx 所在 IP 地址的请求,并且这些请求的 HTTP 头信息中的 Host 为所要处理的域名(如下以80端口为例),如下几个 server 就对应响应的请求 ...
- Codeforces 76D 位运算
题意:给你两个数x 和 y, x = a + b, y = a XOR b,问有没有合法的a和b满足这个等式? 思路:有恒等式: a + b = ((a & b) << 1) + ...
- Java-Properties文件读取工具类
import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configurat ...
- 从顶端插入,滚动展示(Demo):
新闻滚动,从顶端插入: <!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11 ...
- Python 执行js的2种解决方案-乾颐堂
第1种方案 SpiderMonkey是Mozilla项目的一部分,是一个用C语言实现的JavaScript脚本引擎, 该引擎分析.编译和执行脚本,根据JS数据类型和对象的需要进行内存分配及释放操作:利 ...
- js 获取ur参数 只要问号后面的那段传进url
//获取url中的参数 function getUrlParam (pName, win) { var sUrl; if (typeof (win) == 'string') { sUrl = win ...
- CentOS 7 更换 阿里云/清华大学 yum 软件源
阿里云参考:https://opsx.alibaba.com/mirror?lang=zh-CN 清华参考:https://mirrors.tuna.tsinghua.edu.cn/help/cent ...