正确写出doublecheck的单例模式
单例模式属于很常见的一种模式,只要是想整个java中该类只需要一个对象即可。默认Spring就是使用的单例模式。
写单例模式的方式很多,现在介绍一个doublecheck的方式。
public class SingletonController {//默认是第一次创建private static volatile boolean isCreate = false;//本类内部创建对象实例private static volatile SingletonController instance;//获取单例的方法public static SingletonController getSingleton() {if (null == instance) {synchronized (SingletonController.class) {if (null == instance) {instance = new SingletonController();//若不加volatile,会产生指令重排序。原因是,可能先赋值地址值给instance,然后再创建对象}}}return instance;}/*** 构造方法私有化,外部不能new*/private SingletonController() {if (isCreate) {throw new RuntimeException("已然被实例化一次,不能在实例化");}isCreate = true;}/*** 防止克隆*/@Overrideprotected Object clone() throws CloneNotSupportedException {return instance;}/*** 防止序列化破环** @return*/private Object readResolve() {return instance;}
}
写单例模式的注意要点
1、构造方法私有化
2、提供一个静态方法返回
3、静态变量对象,可以懒汉式,也可以饿汉式。
那么对于doublecheck的方式,还需要注意
1、需要有2个if。第一个,提示效率,第二个防止第一次的时候,多个线程都在这里等着,比如第二个线程进去之后第二个if就可以判断第一个线程是否真正的创建成功了对象。
2、instance = new SingletonController();可能会指令重排序,比如先赋值地址,再在内中开辟内存空间存对象。所以可能第一个if只是有了地址,那它就不会null,就直接返回了,这个时候就用问题。因此,必须instance要使用volatile保证有序性,防止指令重排序。
另外,单例是可以破坏的,比如万恶之源的反射,序列化,clone等,不过都可以使用响应的解决办法予以预防,具体见代码。
【完,喜欢就点个赞呗】
正在BAT的路上修行
正确写出doublecheck的单例模式相关推荐
- 路径问题(如何正确写出文件路径)
package star.july;import java.io.IOException; import java.io.PrintWriter;import javax.servlet.Servle ...
- python入门之一运算符与表达式:第一关正确写出表达式
#(1)从测试集获取整数数值a,b,c,d,e a=int(input()) #输入a并转换为整型 b=int(input()) ...
- 如何写出正确的二分查找?——利用循环不变式理解二分查找及其变体的正确性以及构造方式...
序言 本文以经典的二分查找为例,介绍如何使用循环不变式来理解算法并利用循环不变式在原始算法的基础上根据需要产生算法的变体.谨以本文献给在理解算法思路时没有头绪而又不甘心于死记硬背的人. 二分查找究竟有 ...
- 小娴的男友小旭不幸患了一种怪病,这种怪病吞噬了他的大部分记忆,同时让他突然间不会书写符合正确语序的英文。神奇的是,虽然他写出的句子看上去杂乱无章,不过经过仔细分析可以发现,如果把单词的顺序倒过来,语法
题目描述 小娴的男友小旭不幸患了一种怪病,这种怪病吞噬了他的大部分记忆,同时让他突然间不会书写符合正确语序的英文.神奇的是,虽然他写出的句子看上去杂乱无章,不过经过仔细分析可以发现,如果把单词的顺序倒 ...
- 你能写出正确的网址吗?
你能写出正确的网址吗? URI的格式 URI的基本组成 URI的查询参数 URI的完整格式 URI的编码 小结 课下作业 上一讲里我们一起学习了HTTP协议里的请求方法,其中最常用的一个是GET,它用 ...
- (多线程同步练习)桌子上有一只盘子,每次只能放一只水果,爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子里的橘子,一个女儿专等吃盘子里的苹果。写出能使爸爸、妈妈、儿子、女儿正确同步工作的
这是操作系统的一道课堂练习题 题目完整描述: 桌子上有一只盘子,每次只能放一只水果,爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子里的橘子,一个女儿专等吃盘子里的苹果.写出能使爸爸.妈 ...
- 用正确方法写出质量好的软件的75条体会
blueski推荐 [2005-6-27] 出处:goto推荐 作者:不详 如何用正确的方法来写出质量好的软件的75条体会 向不知名的作者表示深深的感谢! 1. 你们的项目组使用源代码管理工具了么? ...
- 金蝶标准版迷你版 数据库引擎找不到对象MSysDb。请确定对象是否存在,并正确的写出他的名称和路径 帐套损坏。
金蝶打开帐套提示 : 数据库引擎找不到对象MSysDb.请确定对象是否存在,并正确的写出他的名称和路径 帐套损坏. 首先判断就是数据库损坏. 我尝试用ACCESS打开.同样的报错. WINHEX 切入 ...
- C++编程进阶3(如何写出正确的operator=、operator运算符的返回值以及是否应该是成员函数的讨论)
八.如何写出一个安全的operator= 首先,operator=的返回值通常是一个类的引用,这一点需要和C++标准库的容器类的operator=保持一致 其次,如果一个类中含有指针成员,那么要防止自 ...
最新文章
- 商贸通服装鞋帽版客户端无法连接服务器的问题(自己遇到的,已解决)
- 【杂谈】有三AI秋季划增加生成对抗网络小组,你准备好大GAN一场了吗
- Bokeh,一个超强交互式Python可视化库!
- java整合html_springBoot整合mybatis、jsp 或 HTML
- 【javascript】操作符:一元操作符
- Linux部署oracle11g,linux环境下部署Oracle11g
- 大白话 设计模式之虚拟工厂
- 数据库审计产品购买者指南
- Js 获取 本周、本月起始时间
- kindeditor上传图片php,使用 KindEditor 编辑器PHP语言本地上传图片提示错误
- 常用命令大全(网络命令+关机重启命令)
- Silvaco_VP_INIT
- cookie 、localStorage 和 sessionStorage 区别
- 沪牌学院-沪拍拍课堂4: 实拍前的演练
- OAuth 2.0设计(以微信登录为例)
- untiy virtual reality supported勾选
- 电机型号如YE2-132M-4-7.5KW-B35(B3)
- Burpsuite 使用教程
- [python]计算miou的方式
- linux输入ll命令各个字段的含义