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(序号)生成器. ...
随机推荐
- nodejs ffi 调用dll
安装依赖 npm install --global --production windows-build-tools(在管理员权限打开的命令行中执行) npm install -g node-gyp ...
- 烽火传递【单调队列优化dp】
题目大意: 1.给出长度为n的数组,要求每m个连续的元素之间必须选一个值作为代价,求该数组的最小代价. 题解思路: 1.显然是线性dp,dp[i]表示选择第 i 个元素时的最小总代价.很明显状态转移方 ...
- Python 常用包收集
转自:http://www.cnblogs.com/Logic0/archive/2010/09/03/1850382.html 常用的自带类库 常用的外部类库 Tkinter———— P ...
- 如何使用C++实现单链表
线性表--链表 为什么假期也在发文章 //TODO NullGirlfrindException 请忽略以上两行无聊的事实...... 如何弥补顺序表的不足之处? 第一次学习线性表一定会马上接触到一种 ...
- LeetCode 278. 第一个错误的版本(First Bad Version)
278. 第一个错误的版本 LeetCode278. First Bad Version 题目描述 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每 ...
- 哈希--Hash,“散列”/“哈希”
哈希 Hash,翻译“散列”,音译为“哈希”,把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散 ...
- 记一次SQL优化
常见的SQL优化 一.查询优化 1.避免全表扫描 模糊查询前后加%也属于全表扫描 在where子句中对字段进行表达式操作会导致引擎放弃使用索引而进行全表扫描,如: select id from t w ...
- Codeforces Round #419 (Div. 1) (ABCD)
1. 815A Karen and Game 大意: 给定$nm$矩阵, 每次选择一行或一列全部减$1$, 求最少次数使得矩阵全$0$ 贪心, $n>m$时每次取一列, 否则取一行 #inclu ...
- Asp.netCore 是用的Socket 吗?
Asp.netCore 是用的Socket 的krestrel 用的是Socket! public static IWebHostBuilder CreateDefaultBuilder(string ...
- NRF52832 Mesh SDK 调试记录
1.Mesh SDK模型,Node节点在重启之后,心跳不能正常保持,即无法在次启动心跳的解决办法: 原因:主要是因为相关模型没有从Flash里面读取所致,因此只需要回复保存配置即可. 关键代码如下: ...