博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式
阅读量:6996 次
发布时间:2019-06-27

本文共 1748 字,大约阅读时间需要 5 分钟。

单例模式Singleton

1.作用:保证整个应用程序中某个实例有且只有一个

2.应用场景:有些对象只需要一个就足够了,例如古代皇帝

3.类型:饿汉模式、懒汉模式、双重校验锁DCL(double checked locking)、静态内部类

 

1.饿汉模式 

//饿汉式public class Singleton {    private static Singleton singleton = new Singleton();    private Singleton() {    }    public static Singleton getInstance() {        return singleton;    }}

说明:饿汉式singleton这个实例是从Singleton这个类被加载后就被创建一直存在于内存中,如果我们一直不使用他就显的有点浪费内存了

 

2.懒汉模式

//懒汉式public class Singleton {    private static Singleton singleton;    private Singleton() {    }    public synchronized static Singleton getInstance() {        if (singleton == null) {            singleton = new Singleton();        }        return singleton;    }}

 说明:在方法上加锁可以解决线程并发问题,单同时解锁需要花费的时间也不少,导致性能下降

 

3.双重校验锁DCL(double checked locking)

//双重校验锁DCL(double checked locking)public class Singleton {    private static Singleton singleton;    private Singleton() {    }    public static Singleton getInstance() {        if (singleton == null) {            synchronized (Singleton.class) {                if (singleton == null) {                    singleton = new Singleton();                }            }        }        return singleton;    }}

说明:方法锁改成代码块锁,减少锁的范围提升性能;如果两个线程同时通过了第一个if条件,如果没有第二个if条件限制此时会创建两个singleton实例,所以两个if条件的验证是为了解决线程并发的情况

 

4.静态内部类

//静态内部类public class Singleton {    private Singleton() {    }    public static Singleton getInstance() {        return SingletonHolder.singleton;    }    private static class SingletonHolder {        private static Singleton singleton = new Singleton();    }}
说明:当外部类Singleton被加载时,其静态内部类SingletonHolder不会被加载,所以他的成员变量singleton不会被实例化,只有当调用 Singleton.getInstance()方法时,才会加载SingletonHolder并且初始化其成员变量,而且类加载时是线程安全的,这样既保证了延迟加载 也保证了线程安全,同时也简化了代码量

转载于:https://www.cnblogs.com/gyli20170901/p/9242320.html

你可能感兴趣的文章
mac下更新自带的PHP版本到5.6或7.0
查看>>
Oracle——10用户自定义函数
查看>>
硬盘空间满导致mysql ibd文件被删后提示Tablespace is missing for table 'db_rsk/XXX"
查看>>
Scala之初步认识与环境准备
查看>>
JFinal跨域方法的两种实现
查看>>
数据库根据字段模糊查询的思路
查看>>
基于IOS上MDM技术相关资料整理及汇总
查看>>
HBase新建表报错 org.apache.hadoop.hbase.TableExistsException
查看>>
微信小程序教程、微信小程序开发资源下载汇总(6.16日更新,持续更新中……)...
查看>>
解决eclipse莫名其妙退出问题
查看>>
MySQL mysqli_connect() 不能连接数据库问题
查看>>
基于ceph rbd+corosync+pacemaker HA-NFS文件共享
查看>>
打造高效研发团队 (3) —— 绩效考核篇
查看>>
MyEclipse中为导入的jar包添加java原文件,可以直接查看java源码
查看>>
java jvm信息查询工具jinfo
查看>>
成为Java GC专家(4) — Apache的MaxClients参数详解及其在Tomcat执行F
查看>>
JPG、PNG和GIF图片的基本原理及优化方法
查看>>
OC对象的retainCount(引用计数器)
查看>>
响应者链
查看>>
linux下交叉编译libcurl支持https
查看>>