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

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

这几天写到一个监听session的功能,其中涉及到了单例模式的线程安全,但是最开始的代码同事说有问题,代码如下:

1     private static SessionManager instance;2 3     public static SessionManager getInstance() {4         if (instance == null) {5             instance = new SessionManager();6         }7         return instance;8     }

 

这种单例就是我记得的懒汉单例,这种单例模式是线程不安全的,即:在多线程时,并不能保证这个类只被实例化一次。解决这个问题需要加锁,代码如下:

1     private static SessionManager instance;2 3     public static synchronized SessionManager getInstance() {4         if (instance == null) {5             instance = new SessionManager();6         }7         return instance;8     }

通过增加synchronized关键字到getInstance()方法中,迫使每个线程在进入方法之前,要先等别的线程离开该方法。也就是说,不会有两个线程可以同时进入这个方法。

这种方法存在的问题:当设置好instance变量后,就不再需要同步这个方法了,之后每次调用这个方法,同步都是一种浪费。

 

所以我们可以在getInstance中进行加锁判断,代码如下:

1     private static SessionManager instance; 2  3     public static SessionManager getInstance() { 4         if (instance == null) { 5             synchronized (SessionManager.class) { 6                 if (instance == null) { 7                     instance = new SessionManager(); 8                 } 9             }10         }11         return instance;12     }

 

这种方法据说会因为java的无序写入失效,所以还是建议使用饿汉单例,代码如下:

1     private static SessionManager instance = new SessionManager();2 3     public static SessionManager getInstance() {4         return instance;5     }

使用这种方法,JVM在加载这个类时会马上创建唯一的单例实例,所以是线程安全的。

 

 

 

转载于:https://www.cnblogs.com/dsgzxy527/p/3557259.html

你可能感兴趣的文章
git .gitignore 文件不起作用
查看>>
Alan Turing的纪录片观后感
查看>>
c#自定义控件中的事件处理
查看>>
django Models 常用的字段和参数
查看>>
IOS--沙盒机制
查看>>
使用 JointCode.Shuttle 访问任意 AppDomain 的服务
查看>>
sqlite的坑
查看>>
digitalocean --- How To Install Apache Tomcat 8 on Ubuntu 16.04
查看>>
【题解】[P4178 Tree]
查看>>
Jquery ui widget开发
查看>>
关于indexOf的使用
查看>>
英语单词
查看>>
Mongo自动备份
查看>>
cer证书签名验证
查看>>
新手Python第一天(接触)
查看>>
【bzoj1029】[JSOI2007]建筑抢修
查看>>
synchronized
查看>>
codevs 1080 线段树练习
查看>>
[No0000195]NoSQL还是SQL?这一篇讲清楚
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>