单例设计模式singleton
简单引入
单例设计模式作为最简单,最常用的设计模式。一般是这两中写法,这两种写法教科书所谓的标准写法,但是实际上存在不少问题。后面介绍标准写法,以规避这些问题。
1.懒汉式:
/*** 问题在于,当多线程工作的时候,如果有多个线程同时运行到if (instance ==* null),都判断为null,那么两个线程就各自会创建一个实例——这样一来,就不是单例了。*/
class Singleton {private Singleton() {};private static Singleton s;public static Singleton getInstance() {if (s == null) {s = new Singleton();}return s;}}
2.恶汉式
class Singleton {private Singleton() {}private static Singleton singleton = new Singleton();public static Singleton getInstance() {return singleton;}}
标准写法
改变懒汉式1.
(规避线程安全问题)加上 synchronized修饰方法即可
class Singleton {private Singleton() {};private static Singleton s;public static synchronized Singleton getInstance() {if (s == null) {s = new Singleton();}return s;}}
改变懒汉式2. 双重检查 Double-Check』写法
1.第一个if 只有instance为null的时候,才进入synchronized的代码段——大大减少了几率。
2.第二个if 是为了防止可能出现多个实例的情况。
class DoubleCheck {private DoubleCheck() {}private static DoubleCheck dCheck;public static DoubleCheck getInstance() {if (dCheck == null) {synchronized (DoubleCheck.class) {if (dCheck == null) {dCheck = new DoubleCheck();}}}return dCheck;}}
改变懒汉式2.之终极版 防止指令重排列 volatile
不知道原子操作,与指令重排的建议复习下
class DoubleCheck2 {private DoubleCheck2() {}private static volatile DoubleCheck2 sCheck;public static DoubleCheck2 getInstance() {if (sCheck == null) {synchronized (DoubleCheck2.class) {if (sCheck == null) {sCheck = new DoubleCheck2();}}}return sCheck;}}
1.恶汉式:
说白了,有classloder装载 就是一开始就创建类
/** 缺点也就只是饿汉式单例本身的缺点所在了——由于INSTANCE的初始化是在类加载时进行的,而类的加载是由ClassLoader来做的,* 所以开发者本来对于它初始化的时机就很难去准确把握:* * 可能由于初始化的太早,造成资源的浪费 如果初始化本身依赖于一些其他数据,那么也就很难保证其他数据会在它初始化之前准备好。*/
class Singleton {private Singleton() {}private static final Singleton singleton = new Singleton();public static Singleton getInstance() {return singleton;}}
由于静态内部类实现
class innerSingleton {private innerSingleton() {}private static class SingletonHolder {private static final innerSingleton SINGLETON = new innerSingleton();}public static innerSingleton getInstance() {return SingletonHolder.SINGLETON;}}
转载于:https://www.cnblogs.com/dgwblog/p/9114189.html
单例设计模式singleton相关推荐
- Java设计模式—单例设计模式(Singleton Pattern)完全解析
转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...
- 单例设计模式-静态内部类
静态内部类 静态内部类应用实例 代码演示 package com.atguigu.principle.singleton.type07;/** * @author victor * @site htt ...
- Java面向对象(16)--单例(Singleton)设计模式
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法.如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构 ...
- 设计模式的征途—1.单例(Singleton)模式
单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修 ...
- 单例设计模式(Singleton)附带案例代码仓库
目录 1 .单例模式的结构 2 .单例模式的实现 2.1.饿汉式(静态变量方式) 2.2.饿汉式(静态代码块方式) 2.3.懒汉式(线程不安全) 2.4.懒汉式(线程安全) 2.5.懒汉式(双重检查锁 ...
- 什么是Singleton,单例设计模式
Singleton [ˈsɪŋɡltən] 单例模式 在java中是指单例设计模式. 单例设计模式: 单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 例如:例如 ...
- 单例设计模式详解。。。。。。。。。。。
public class Demo01 { public static void main(String[] args) { // TODO Auto-generated method stub /* ...
- java单例设计模式
单例模式的概念 单例类只有一个实例,并且只由自己创建,实例化后向整个系统提供自己的实例. 单例设计模式主要分为2种:懒汉式和饿汉式.2者的区别在于初始化的时间不同. 像线程池,缓存,日志等都被设计成单 ...
- 单例设计模式八种方式——5) 懒汉式(线程安全,同步代码块) 6) 双重检查 7) 静态内部类 8) 枚举
懒汉式(线程安全,同步代码块)应用实例 优缺点说明: 1) 这种方式,本意是想对第四种实现方式的改进,因为前面同步方法效率太低, 改为同步产生实例化的的代码块 2) 但是这种同步并不能起到线程同步的作 ...
最新文章
- 一生应该感谢的十种人
- JAVA 利用SimpleDateFormat将String转换为格式化的日期
- Linux内核中无名管道pipe和有名管道fifo的分析
- JS 新建web sql 数据表
- linux之进程间通信--使用信号
- 多线程场景下利用ThreadLocal是线程安全?
- 二维数组各行求和_JS数组reduce()方法详解及高级技巧
- 使用Visual Studio来创建动态库/静态库,并加载
- 小莫qq影视机器人-自定义对接影视教程
- knx智能照明控制系统电路图_智能照明控制系统(KNX)教材
- android 微信授权失败,安卓端微信授权失败,返回code=-1
- 空手套白狼的典型案例,利用各方资源一年狂赚300万!
- web前端期末大作业 html+css学生心理 7页主题网页设计
- 夏天第一图noob sky
- 探寻埋藏在心底的梦想,社科院与杜兰大学金融管理硕士项目伴你同行
- CRM 学习笔记(一)
- 零基础入门CV - Task 03 字符识别模型.md
- 整理了MariaDB和MySQL数据库历年发布版本和对应关系,方便记忆命令。
- 如何修改报表平台中数据决策系统登陆地址
- 小米手机开启“启用MIUI优化”,导致Android Studio无法成功直接安装