单例设计模式
发布日期:2021-06-30 18:22:46
浏览次数:3
分类:技术文章
本文共 1647 字,大约阅读时间需要 5 分钟。
单例模式 = 私有的构造方法 + 私有静态的成员变量 + 一个公有的对象返回方法
首先,第一种
饿汉式
就是在定义私有静态的成员变量的时候,就直接将对象new出来
//饿汉式//私有静态的成员变量private final static Singleton INSTANCE = new Singleton();//私有的构造方法private Singleton(){ }public Singleton getInstance(){ return INSTANCE;}
然后是第二种
懒汉式
这种方法有一个线程安全的问题
首先看一种线程不安全的情况
//懒汉式(不可使用,存在线程安全问题)//定义静态的成员变量,但不直接new出来private static Singleton instance =null;//私有的构造方法private Singleton(){ }public Singleton getInstance(){ if (instance == null) { instance=new Singleton(); } return instance;}
这是懒汉式中最简单的一种写法,只有在方法第一次被访问时才会实例化,达到了懒加载的效果。但是这种写法有个致命的问题,这种没有加锁,存在线程安全问题。假设对象还没被实例化,然后有两个线程同时访问,那么就可能出现多次实例化的结果,所以这种写法不可采用。
解决线程安全问题,加锁!!!
在getInstance()方法上加上synchronized关键字,这样就可以达到线程安全的效果.
//懒汉式(加锁可用)//定义静态的成员变量,但不直接new出来private static Singleton instance =null;//私有的构造方法private Singleton(){ }public synchronized Singleton getInstance(){ if (instance == null) { instance=new Singleton(); } return instance;}
保证了同一时刻只能有一个线程访问并获得实例,但是缺点也很明显,因为synchronized是修饰整个方法,每个线程访问都要进行同步,而其实这个方法只执行一次实例化代码就够了,每次都同步方法显然效率低下,为了改进这种写法,就有了下面的双重检查懒汉式。
双重检查懒汉式(可用,推荐)
//双重检查懒汉式//定义静态的成员变量,但不直接new出来private static Singleton instance = null;//私有的构造方法private Singleton() { }//公有的获取对象的方法public Singleton getInstace() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance;}
这是很多开发者推荐的一种写法,这种静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成对象的实例化。
同时,因为类的静态属性只会在第一次加载类的时候初始化,也就保证了SingletonInstance中的对象只会被实例化一次,并且这个过程也是线程安全的。
转载地址:https://libolin.blog.csdn.net/article/details/108967166 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月18日 14时50分02秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
mysql 8.0.11 用Navicat远程无法连接
2019-04-30
Tomcat控制台中文乱码解决办法
2019-04-30
修改Tomcat控制台标题
2019-04-30
如何将解压版的tomcat设置为windows 服务启动
2019-04-30
异常:Invalid character found in the request target. The valid characters are defined in RFC 3986
2019-04-30
修改tomcat默认的session时间
2019-04-30
Tomcat之Session名称修改-springboot
2019-04-30
centos7安装sftp服务器
2019-04-30
用正则表达式匹配网址URL中最后一个反斜杠/后面的内容
2019-04-30
mysql 服务器启用event_scheduler
2019-04-30
centos7下安装docker
2019-04-30
Linux服务器,服务管理--systemctl命令详解,设置开机自启动
2019-04-30
路由表及路由的选择算法
2019-04-30
2019年备受关注的5个IT系统灾难恢复技术趋势
2019-04-30
机房空调知识介绍
2019-04-30
火神山医院紧急招募IT运维志愿者需求
2019-04-30
2020年数据中心值得关注的8大趋势
2019-04-30