偷颗菜抱回家
2016-12-16 10:31:43
原
java实现两种常用的线程安全的单例模式
单例模式经常会使用,但是在多线程环境下,不规范的单例写法还是会出现单例对象并非单例。这里分享两个常用的线程安全的单例模式,当然还有其他实现线程安全的单例。
1、双层检测
public class Instance implements Serializable { /** * @since JDK 1.7 */ private static final long serialVersionUID = -4827759752671402638L; private volatile static Instance instance = null; private Instance(){} //双层检测,在1.5以后Instance对象开始提供volatile关键字修饰变量来达到稳定效果 public static Instance getInstance(){ if(instance == null){ //注意是synchronized 字节码,不是synchronized 对象 synchronized(Instance.class){ if(instance == null){ instance = new Instance(); } } } return instance; } @Override public String toString() { return "DCL检测"; } /** * 因实现Serializable接口。反序列化单例需要 ,在反序列化时会被调用,若不加此方法 则反序列化的类不是单例的 */ private Object readResolve() throws ObjectStreamException { return getInstance(); } }
2、静态内部类
public class Instance2 implements Serializable { /** * @since JDK 1.7 */ private static final long serialVersionUID = 6921443757360064842L; private Instance2(){} //静态内部类 private static class Instance2Holder{ private static Instance2 instance = new Instance2(); } public static Instance2 getInstance(){ return Instance2Holder.instance; } @Override public String toString() { return "静态内部类"; } /** * 因实现Serializable接口。反序列化单例需要 ,在反序列化时会被调用,若不加此方法 则反序列化的类不是单例的 */ private Object readResolve() throws ObjectStreamException { return getInstance(); } }
运行截图:
猜你喜欢
- java线程同步工具之CountDownLatch线程上锁等待
- 利用java线程实现数据上传demo
- java开发自定义线程池实例,基于maven构建
- java线程池同步处理实例
- 【Java多线程】写入同一文件,自定义线程池与线程回收利用
- spring线程池ThreadPoolExecutor配置并且得到任务执行的结果
- java web mvc架构的网上购物商城源码,支持高并发下的安全购物
- java swing编写简易聊天室,java初学者可以学习java线程与网络编程的基础知识
- 一段很有趣的java代码,保证你没看过
- jsp滑动拼图极验验证java代码,让用户登录注册更安全,使页面效果更精美
- PHP post&get参数安全过滤类
- java内存释放
请下载代码后再发表评论
相关代码
最近下载
最近浏览
mayya86 LV1
2022年10月2日
xuexizhuanyong23 LV16
2022年7月3日
2469095052 LV8
2021年12月29日
niugaofeng LV3
2021年6月21日
好的好的 LV8
2021年6月18日
镜影 LV3
2021年6月17日
我家大宝贝 LV4
2021年6月10日
qqyouxiang2019 LV2
2021年5月24日
vae222 LV2
2021年5月3日
zhou4048 LV1
2021年4月15日