java写一个线程安全的单例模式Singleton
发布日期:2021-09-25 11:48:26 浏览次数:4 分类:技术文章

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

1.饿汉式单例

指在方法调用前,实例就已经创建好了

package jichu;public class Singleton {	private static Singleton instance=new Singleton();	private Singleton(){			}	public static Singleton getInstance(){		return instance;	}}

注意:要保证系统中不会有人意外创建多余的实例,便把构造函数设置为private,instance对象必须是private且是static的,如果不是private那么instance的安全性将无法保证,一个小小的意外可能使得instance变为null

存在问题:Singleton实例在什么时候创建是不受控制的,对于静态成员instance,它会在类第一次初始化的时候被创建,这个时刻并不一定是getInstance方法第一次被调用的时候

2.加入synchronized的懒汉式单例

指在调用的时候才去创建这个实例,为了防止对象被多次创建,使用synchronized进行方法同步

package jichu;public class Singleton {	private static Singleton instance;	private Singleton(){			}	public static synchronized Singleton getInstance(){		if(instance==null){			instance=new Singleton();		}		return instance;	}}

优点:充分利用了延迟加载,只在真正需要时创建对象

缺点:并发环境下加锁,竞争激烈的场合对性能可能会产生一定的影响

3.使用静态内部类的方式

利用classloder机制来保证初始化instance时只有一个线程,和饿汉式的区别是:饿汉式只要Singleton类被加载,那么instance就会被实例化,而这种方式是Singleton类被加载了,instance也不一定被初始化,只有通过调用getInstance()方法时才会显式装载SingletonHolder类,从而实例化instance,可以做到真正需要的时候创建实例

package jichu;public class Singleton {	private Singleton(){			}//	静态内部类	private static class SingletonHolder{		private static Singleton instance=new Singleton();	}	public static Singleton getInstance(){		return SingletonHolder.instance;	}}

4.双重校验锁,不推荐

package jichu;public class Singleton {	private volatile static Singleton instance=null;	private Singleton(){			}	public static Singleton getInstance(){		if(instance==null){			synchronized(Singleton.class){				if(instance==null){					instance=new Singleton();				}			}		}		return instance;	}}

为什么用两个if判断这个对象是否是空?

因为当有多个线程同时创建对象的时候,多个线程有可能都停止在第一个if判断的地方,等待锁的释放,然后多个线程都创建了对象,这样就不是单例模式了,so,使用两个if

5.使用static代码块

静态代码块中的代码在使用类的时候就已经执行

package jichu;public class Singleton {	private static Singleton instance=null;	private Singleton(){			}	static {		instance=new Singleton();	}	public static Singleton getInstance(){		return instance;	}}

6.使用枚举数据类型

package jichu;public class Singleton {	private enum MyEnumSingleton{		singletonFactory;		private Singleton instance;//		枚举类的构造方法在类加载时被实例化		private MyEnumSingleton(){			instance=new Singleton();		}		public Singleton getInstance(){			return instance;		}	}	public static Singleton getInstance(){		return MyEnumSingleton.singletonFactory.getInstance();	}}

原文地址:m/wmyskxz/p/9021597.html

转载地址:https://blog.csdn.net/Autumn03/article/details/81097261 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:类加载机制
下一篇:线程通信简单实例

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年03月20日 20时22分32秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

python 爬虫 selenium作用_浅谈python爬虫使用Selenium模拟浏览器行为 2019-04-21
java file类 topath_Java File类int compareTo(File filepath)方法与示例 2019-04-21
Java读取Linux硬盘状态_Linuxiostat监测IO状态,fdisk查看硬盘挂载情况 2019-04-21
python中row_values_python rowvalues 2019-04-21
python中textinput_如何使用QML在Python中使用TextInput? 2019-04-21
我的世界java追踪光影_探索MC的光线追踪 真实光影下的马赛克世界 2019-04-21
php接收自定义header_php通过header发送自定义数据方法 2019-04-21
php把时间改为星期,php如何将指定时间转化成星期几 2019-04-21
php 数组键重复,php – 获取数组中重复值的键 2019-04-21
java script中定义的var变量怎么在body中使用,怎么在jsp页面元素中使用js中的变量... 2019-04-21
java字符串转xml w3c,java – 将org.w3c.dom.Node转换成String 2019-04-21
matlab工程热力学大程序,西安交通大学工程期末编程大作业(完整版 2019-04-21
java ftp 重命名文件,当前用户目录与root不同时,无法使用ftp方法重命名文件 2019-04-21
用php写一个时钟效果,用HTML5的canvas实现一个炫酷时钟效果 2019-04-21
php分布式缓存 redia,分布式缓存Memcache与Redis 2019-04-21
java+根据距离排序,将模糊匹配与地理距离排序相结合的弹性搜索 2019-04-21
解析式粗对准 matlab,基于MEMS的捷联惯导系统组合对准技术研究 2019-04-21
php怎么实现登陆,利用ThinkPHP怎么实现一个登陆功能 2019-04-21
oracle 创建 作业,三种数据库创建作业(事件)的语法 2019-04-21
Oracle扩展temp表空间命令,如何在oracle中缩小临时表空间?ORA-01652无法在表空间中扩展temp... 2019-04-21