singleton单例模式小结
1.饿汉模式
public class SingletonEntity2 {
// 在类加载的时候创建对象:饿汉模式
public static SingletonEntity2 obj = new SingletonEntity2();
// 构造方法私有化
private SingletonEntity2(){}
public static SingletonEntity2 getInstance(){
return obj;
}
}
2.懒汉模式
public class SingletonEntity {
// 静态变量存放在方法区中,类加载的时候赋值,而且只会赋值一次,懒汉模式
public static SingletonEntity obj = null;
// 构造方法私有化
private SingletonEntity() {}
// 对外提供获取实例的公开的静态的方法
public static SingletonEntity getInstance() {
if (obj == null) {
obj = new SingletonEntity();
System.out.println("新创建实例");
}
System.out.println("直接返回实例");
return obj;
}
}
3.测试类
public static void main(String[] args) {
SingletonEntity obj1 = SingletonEntity.getInstance();
SingletonEntity obj2 = SingletonEntity.getInstance();
System.out.println(obj1 == obj2); // true
}
==========================================================================================================================================
懒汉模式不安全性测试:
1.起现成类:
public class RunnableThreadTest implements Runnable {
@Override
public void run() {
SingletonEntity obj = SingletonEntity.getInstance();
System.out.println(Thread.currentThread().getName()+" "+obj);
}
}
2.测试类:
public class SingletonTest {
public static void main(String[] args) {
Thread thread1 = new Thread(new RunnableThreadTest());
Thread thread2 = new Thread(new RunnableThreadTest());
thread1.start();
thread2.start();
}
}
3.运行结果:
Thread-0 com.beijing.singleton.SingletonEntity@406866f9
Thread-1 com.beijing.singleton.SingletonEntity@25eb939e
==========================================================================================================================================
改善结果:推荐使用双检查锁机制
public class SingletonEntity {
// 静态变量存放在方法区中,类加载的时候赋值,而且只会赋值一次,懒汉模式
public static volatile SingletonEntity obj = null;
// 构造方法私有化
private SingletonEntity() {
}
// 对外提供获取实例的公开的静态的方法
public static SingletonEntity getInstance() {
try {
// 双检查所机制
if (obj == null) {
synchronized (SingletonEntity.class) {
if (obj == null) {
Thread.sleep(1000);
obj = new SingletonEntity();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
}
为什么要用volatile修饰instance?
原因:在于instance = new SingletonEntity()的时候,在内存中实际上是分3步执行的:
1)分配对象的内存空间:memory = allocate();
2)初始化对象:ctorInstance(memory);
3)指向分配的地址:instance =memory
多线程在执行的时候,2 3可能发生重排序。即有可能线程A执行到第3步的时候,读取到instance不为null,就返回。实际上此时还未执行第二部即未初始化。
加上volatile就可以避免2 3步重排序来保证线程安全。
singleton单例模式小结的更多相关文章
- singleton单例模式
单例设计模式 单例设计模式概述 单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供 优点: 在系统内存中只存在一个对象,因此可以解决系统资源,对于一些需要频繁 ...
- Singleton 单例模式 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 设计模式01: Singleton 单例模式(创建型模式)
Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...
- Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。
...
- SingleTon单例模式总结篇
在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式.适用的场景在于:对于定义的一个类,在整个应用程序执行期间只有唯一的一个实例对象. 一,懒汉式: 其特点是延迟加载,即当需要用到此单一实 ...
- (转)Singleton 单例模式(懒汉方式和饿汉方式)
原文地址:http://www.cnblogs.com/kkgreen/archive/2011/09/05/2166868.html 单例模式的概念: 单例模式的意思就是只有一个实例.单例模式确保某 ...
- 单例模式简单解析--Singleton 单例模式(懒汉方式和饿汉方式)
单例模式的概念: 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 关键点: 1)一个类只有一个实例 这是最基本 ...
- Java Singleton 单例模式
大家可能还听过 Singleton 也就是单例模式 这个单例模式要求 在程序的运行时候 一个程序的某个类 只允许产生一个 实例 那么 这个类就是一个单例类 Java Singleton模式主要作 ...
- 【转】Singleton单例模式
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号)生成器. ...
随机推荐
- [DFS]排队(间隔排列)-C++
Description 小Q是班长.在校运动会上,小Q班要进行队列表演.小Q要选出2*N名同学编队,每人都被编上一个号,每一个从1到N的自然数都被某2名同学佩戴,现在要求将他们排成一列,使两个编号为1 ...
- (一)构建基于ubuntu docker MySQL 5.6 镜像并推送到Docker Hub
一,创建目录二,文件准备三,构建四,使用五,在宿主机上连接docker 中的mysql六,推送镜像到Docker hub 一,创建目录 mkdir -p mysql/5.6 二,文件准备 注意执行脚本 ...
- 数据结构-单链表-类定义2-C++
上一次的C++链表实现两个单链表的连接不太理想,此次听了一些视频课,自己补了个尾插法,很好的实现了两个链表的连接,当然了,我也是刚接触,可能是C++的一些语法还不太清楚,不过硬是花了一些时间尽量在数据 ...
- 小细节--关于printf的输出问题
关于printf输出函数,曾经在栈和队列中有过提及,并未作过深入的研究,今天在看一些面经的时候发现有的公司有所提及,那么就势研究一下 面试题如下: 首先看一下printf函数在汇编层面上是如何实现的: ...
- AJAX调用案例随笔(个人观看使用)
<script type="text/javascript"> /*var contextpath = "http://192.168.0.103:8080/ ...
- NodeJS的环境搭建+传统ELmentui+vue开发
ElementUI简介 我们学习VUE,知道它的核心思想式组件和数据驱动,但是每一个组件都需要自己编写模板,样式,添加事件,数据等是非常麻烦的, 所以饿了吗推出了基于VUE2.0的组件库,它的名称叫做 ...
- 利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4
利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4 以前看视频的时候,直接找到 video标签,查看视频地址,然后下载下来.. 后来发现,好多 video 标签打开元素审查,如下 ...
- PHP Math常量
常量名 常量名 常量值 PHP M_E e 2.7182818284590452354 4 M_EULER Euler 常量 0.57721566490153286061 5.2.0 M_LNPI l ...
- Identityserver4证书
dotnet应用用IdentityServer4做了登陆的功能,本地运行没有问题,部署到服务器上面就出现上面的问题,打开服务器的日志记录开关,获取到下面的异常信息.原来是 通过分析日志信息 ...
- ElementUI+命名视图实现复杂顶部和左侧导航栏
在了解了命名视图的用途后,发现用命名视图来实现复杂导航更加省力.更多知识请参考这里 这里只说明重要配置内容,其他内容配置请参考上一篇初始版本: ElementUI 复杂顶部和左侧导航栏实现 或参考文末 ...