JAVA多线程-通过Synchronized实现单例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JAVA多线程-通过Synchronized实现单例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2052字,纯文字阅读大概需要3分钟。
内容图文
![JAVA多线程-通过Synchronized实现单例](/upload/InfoBanner/zyjiaocheng/632/7f1770f480b34d9fb1b171ef67b52083.jpg)
单例模式,我们或多或少的听过或者用过,就是确保某一个对象只有一个实例,我们先看下一般的写法:
package com.ck.single;
public class Champion {
??? private static final Champion champion = new Champion();
??
??? private Champion() {
??? }
??? public static Champion getInstance() {
??????? return champion;
??? }
}
这样写有一个缺点,就是在项目启动时Champion就已经在JVM中产生对象了,如果单例模式的类比较多,那是很占内存的,这种写法称为饿汉式,还有另外一种成为懒汉式,就是在使用的时候初始化对象。
下面我稍微修改下:
package com.ck.single;
public class Champion {
??? private static Champion champion = null;
??? private Champion() {
???????
??? }
??? public static Champion getInstance() {
??????? if(champion == null) {
??????????? champion = new Champion();
??????? }
??????? return champion;
??? }
}
这样写虽然缓解了对象的延迟创建,在低并发的情况下可能不会出现问题,但是在高并发情况下可能会出现多个对象,这就违背了单例,什么原因呢?比如两个线程同时进入champion == null,结果判断条件都为真,那么两个线程 则产生了两个对象。
为了保证线程安全,我们引入Synchronized实现单例,我们修改代码:
package com.ck.single;
public class Champion {
??? private static Champion champion = null;
??? private Champion() {
??? }
??? public synchronized static Champion getInstance() {
??????? if(champion == null) {
???????????
??????????? champion = new Champion();
??????? }
??????? return champion;
??? }
}
上面代码的synchronized作用域是静态方法,所有属于类锁,这个我们前面已经讲过,虽然加锁了,但是在并发情况下所有线程都要同步等待,这样即使对象存在了,所有线程也要等待,所以我们需要再优化下:
package com.ck.single;
public class Champion {
???private static volatile Champion champion = null;
??? private Champion() {
??? }
??? public? static Champion getInstance() {
??????? if(champion == null) {
??????????? synchronized(Champion.class) {
??????????????? if(champion == null) {
?????????????????? champion = new Champion();
??????????????? }
??????????? }
??????? }
??????? return champion;
??? }
}
改完后的程序,我们会发现虽然两次判断空的情况,但是提升了代码性能,因为如果对象已经存在的话就不需要等待了,而是直接返回。
内容总结
以上是互联网集市为您收集整理的JAVA多线程-通过Synchronized实现单例全部内容,希望文章能够帮你解决JAVA多线程-通过Synchronized实现单例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。