支持多并发的单例有哪几种写法

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

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

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

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

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

    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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

兼容各种浏览器的自动左右滚动兼左右点击滚动代码

直接切入正题 红色表示要统一&#xff08;所有的id&#xff09; 演示地址&#xff1a;http://www.er-china.com/index.php?mcontent&cindex&alists&catid772 本框架为phpcms&#xff0c;大家可根据自己的框架更改循环。 <div class"rollBox"> <…

同步数据库仅在Worker内,目前只有Chrome6支持

Database.html <!DOCTYPE HTML><html> <head> <meta charset"UTF-8"> <title></title> </head> <body> <script> if(window.Worker){ var workernew Worker(worker.js); //向worker发送消息 wo…

全局曝光和卷帘曝光的区别

全局曝光和卷帘曝光是常见的相机曝光方式。一般来说&#xff0c;CCD相机是全局曝光&#xff0c;而CMOS相机则存在卷帘曝光。那么&#xff0c;这两种方式孰优孰劣呢&#xff1f;或者说&#xff0c;他们两者的差别在哪里呢&#xff1f;那么&#xff0c;先从两者的定义说起。 全局…

*p++、*(p++)、*++p、*(++p)的区别

1、*p 与 *(p)的区别 因为“”的优先级大于“*”&#xff0c;所以*p 相当于*(p)。 但是p表示先运算再&#xff0c;所以*p或者*(p)&#xff0c;其实等价于“先(*p)&#xff0c;然后再p”。 注意&#xff0c;“先(*p)&#xff0c;然后再p”不能表示成“ (*p)”&#xff0c;因为(*…

MySQL常用总结

创建数据库&#xff0c;指定编码utf8 create database wish charset utf8; 删除库 drop database wish; 使用库 use wish; 查看有什么表 show tables; 删除表 drop table wish; 清空表所有数据(主键从1开始) truncate stu; 显示表结构 desc wish; show create table wish; 设置…

Titanium 列表显示TableView

效果&#xff1a; Titanium中列表显示需要创建TableView var tableView Ti.UI.createTableView({style: Ti.UI.iPhone.TableViewCellSelectionStyle.NONE //TableView样式}); TableView的每一个行叫做TableViewRow 设置TableViewRow的hasChild为true便可显示这样的效果&#x…

Matlab的fspecial函数

函数原型 h fspecial(type) h fspecial(type&#xff0c;para) 根据函数原型对fspecial函数作个说明&#xff0c;fspecial是用来生成滤波器&#xff08;也叫算子&#xff09;的函数&#xff0c;使用type参数来指定滤波器的种类&#xff0c;使用para来对具体的滤波器种类添…

discuz x2.5插件开发傻瓜图文教程,用demo说话

2019独角兽企业重金招聘Python工程师标准>>> 刚刚接触DZ的插件开发&#xff0c;记个傻瓜图文教程&#xff0c;一是分享给初学者&#xff0c;二是方便自己以后回忆。 本篇文章适合人群&#xff1a;有一定的PHP开发经验&#xff0c;想通过一个简单明了的demo快速了解…

uboot源码——gd_t 类型、bd_t 类型

bd_t、gd_t是u-boot中两个重要的数据结构&#xff0c;初始化操作中很多全局变量都要靠这两个数据结构来保存或传递。 两者分别定义在include/asm-arm/u-boot.h、include/asm-arm/global_data.h中。 一、bd_t 类型 struct bd_info 这个结构体类型&#xff0c;主要是用来保存板子…

代码抽象的三原则

软件开发是"抽象化"原则&#xff08;Abstraction&#xff09;的一种体现。 所谓"抽象化"&#xff0c;就是指从具体问题中&#xff0c;提取出具有共性的模式&#xff0c;再使用通用的解决方法加以处理。 开发软件的时候&#xff0c;一方面&#xff0c;我们总…

对图像高频信号和低频信号的理解

今天开始讲图像了&#xff0c;讲了很多在频域处理的方法&#xff0c;回来复习一下图像的频域。 一 、关于图像高频和低频 1.1 对图像高频信号和低频信号的理解 图像中的低频信号和高频信号也叫做低频分量和高频分量。 简单一点说&#xff0c;图像中的高频分量&#xff0c;…

关于开源中国手机App的说明

随着移动互联网大潮的快速发展&#xff0c;开源中国社区作为国内大型IT技术人员社区也推出了手机移动客户端&#xff0c;覆盖iOS&#xff0c;Android以及Windows Phone这三个手机平台。主要为了能让我们的用户能随时随地的与开源中国社区的用户进行交流与互动。我们需要App实现…

uva 11174(排列组合+搜索)

依然是liurujia计数练习题。依然是自己想没想出来&#xff0c;在MOD是素数的情况下除以x即为乘x的逆。这个真心以前没听过&#xff0c;用了这个方法后处理就变得十分巧妙。 整个程序步骤还是很清晰的&#xff0c;先上来算阶乘与逆&#xff08;求数的逆还是有点没理解透&#xf…

将Source Insight的代码拷贝到word文档的方法

1、用Source Insight打开文件后&#xff0c;File->Print&#xff1b; 2、在 常规->选择打印机中&#xff0c;选择“Adobe PDF”&#xff08;或者其他pdf打印机&#xff09;&#xff1b; 3、点确定&#xff0c;输出一个pdf文件了&#xff0c;然后去pdf文件里面复制代码&…

Oracle 学习笔记

2019_6_27日 星期四 第一章 oracle从入门到精通Laarry Ellison: 拉里.埃里森Bruce Scott: Tiger PointBase(WebLogic软件产品中附赠的数据库产品) 1.1 oracle安装oracle从实际的开发来讲&#xff0c;oracle11g是使用较多的&#xff0c;oracle的开发主要分为两类&#xff1a;.数…

引导滤波的opencv实现以及解释

参考&#xff1a; https://blog.csdn.net/qq_36006553/article/details/78594205

S5PV210的地址映射简介

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 S5PV210属于ARM Cortex-A8架构&#xff0c;是32位的CPU&#xff0c;有32根地址线和32根数据线。 这表明该CPU的寻址空间为4G&#xff0c;地址映射关系见下述。 S5PV210的地址映射 S5PV210的地址映射…

本杰明 富兰克林 道德13准则

富兰克林认为&#xff0c;好的习惯必须加以培养&#xff0c;坏的习惯必须打破。为了克服缺点&#xff0c;使自己少犯错误&#xff0c;他制定了13条道德准则。他说&#xff1a;“我打算获得这13种美德&#xff0c;并养成习惯。为了不致分散精力&#xff0c;我不指望一下子全做到…

树莓派(Raspberry Pi):完美的家用服务器

出处&#xff1a;http://linux.cn/thread/11884/1/1/ 树莓派&#xff08;Raspberry Pi&#xff09;&#xff1a;完美的家用服务器 自从树莓派发布后&#xff0c;所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒&#xff0c;但…

无需删除D盘文件,将D盘空间分给C盘

做深度学习或机器学习的小伙伴&#xff0c;不知不觉就发现自己电脑C盘空间不够用了&#xff0c;但是D盘空间看着又很充裕&#xff0c;那么问题来了&#xff0c;怎么将D盘空间分给C盘呢&#xff0c;网上搜索了一圈&#xff0c;发现很多方法需要删除D盘文件才能将空间分享给C盘&a…