解决多线程下单例模式中"懒汉模式"(延迟加载)的问题
2016-03-18 11:37
603 查看
获取单例对象的代码
public class MyObject { private MyObject(){} private static MyObject object; public static MyObject getInstance() { try { if (object == null) {
object = new MyObject(); } } catch (InterruptedException e) { e.printStackTrace(); }
return object; } }
当启动多个线程执行MyObject.getInstance()的时候,获取到的对象会有多个,解决办法:
在getInstance()方法上加synchronized关键字 public class MyObject { private MyObject(){} private static MyObject object; synchronized public static MyObject getInstance() { try { if (object == null) {
object = new MyObject(); } } catch (InterruptedException e) { e.printStackTrace(); }
return object; } }
这样整个方法会被上锁,效率低。
使用DCL双检查锁机制 public class MyObject { private MyObject(){} private static MyObject object; public static MyObject getInstance() { try { if (object == null) {
synchronized(Myobject.class){
if(object==null){
object = new MyObject();
}
} } } catch (InterruptedException e) { e.printStackTrace(); }
return object; } }
使用静态内置类实现单例 public class MyObject { private MyObject(){} private static class MyObjectHandler{ private static MyObject myObject = new MyObject(); } public static MyObject getInstance() { return MyObjectHandler.myObject; } }
该方法在序列化及序列化的时候前后得到的对象会发生变化,添加readResove()方法即可:
public class MyObject implements Serializable { private static final long serialVersionUID = 1L; private MyObject(){} private static class MyObjectHandler{ private static final MyObject myObject = new MyObject(); } public static MyObject getInstance() { return MyObjectHandler.myObject; } protected Object readResolve() throws ObjectStreamException{ System.out.println("调用了readResolve方法! "); return MyObjectHandler.myObject; } }
相关文章推荐
- springmvc中的@Responsebody与@RequestBody
- 石头剪刀
- C#:判断一个String是否为数字
- C#:读取配置文件
- CSS3---绘制六边形
- 160. Intersection of Two Linked Lists
- VIJOS-P1406 古韵之鹊桥相会 最短路 模型
- ANDROID L - Material Design详解(UI控件)
- centos7 配置开机自启redis
- 装饰器模式
- ANDROID L - Material Design详解(动画篇)
- 爬虫技术做到哪些很酷很有趣很有用的事情
- JAVA软件工程师应该具备的基本素质(技能)
- git 命令学习
- C#:获取时间年月日时分秒格式
- 遭遇人工智能?莫慌!我们有必杀技
- 五大常用算法——分治算法
- Java 回顾笔记_Sting类2
- ANDROID L - Material Design详解(主题和布局)
- 【Java】Java中GUI之布局管理器