java集群优化——多线程下的单例模式
在最初学习设计模式时,我为绝佳的设计思想激动不已,在以后的project中。多次融合设计模式,而在当下的设计中。我们已经觉察出了当初设计模式的高瞻远瞩。可是也有一些不足,须要我们去改进。有人说过。世界上没有绝对的事,当然,再简单的事情,环境变了,也会发生变化,今天和大家一起分享在多线程下单例模式的优化。
1,传统
首先,我们回想下传统的单例(懒汉式)是怎样工作的:
public class SingletonClass{
private static SingletonClass instance=null;
public static SingletonClass getInstance()
{
if(instance==null)
{
instance=new SingletonClass();
}
return instance;
}
private SingletonClass(){
}
}
我们不难看出,在多线程执行时,普通的代码会带了困恼,大家看多线程代码执行时的图片:
2,双重锁
我们看到线程1和线程2都运行了代码②,我们得到的并非一个单例的对象,而是多个对象。针对这些我们进行了同步的优化。
public static class Singleton{
private static Singleton instance=null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(null==instance){
instance=new Singleton();
}
}
}
return instance;
}
}
我们在看看这样的代码的多线程执行图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
大家看,③只执行了一次。不不过它被同步机制保护了,并且是进行了双重判定。这样保证多线程下单例模式的正常执行。
3,枚举
在jdk1.5之后。java注意到这一细节,在创建单例应用时,我们能够利用枚举类型完毕我们的工作,而且他是线程安全的。
源代码:
public enum SingletonEnum
{
INSTANCE;
private String name;
publicString getName()
{
returnname;
}
publicvoid setName(String name)
{
this.name = name;
}
}
这样的优化,使我们更优雅地适用代码。可是也带来了一定的问题,就是我们对对象的类型有了模糊的概念,所以在工作中,还是建议保留双锁模式,对一些工具类则能够採取枚举类型优化,简化我们的代码与逻辑。
总结:
细节的优化。就像雕琢一件艺术品,我们接触的高人越多。这种思想就越浓厚,所以,我们经常推断一个人事怎么的品格与素养,通过他接触的人。朋友就能够猜測出来,而计算机内。也是如此,我们接触的优秀框架多了。自己自然就是优秀的设计师。
最新文章
- js(jquery)解决input元素的blur事件和其他非表单元素的click事件冲突的方法
- Vmware玩mac os x分享
- 使用 Python 切割图片
- shell 初学者 必读 ,强烈推荐新手读
- 完成端口(CompletionPort)详解
- TRIZ系列-创新原理-29-气动或液压结构原理
- HDU 1248 冰封王座(dp)
- 现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的
- Quartz源码——QuartzSchedulerThread.run() 源码分析(三)
- Solidity constant view pure关键字的区别与联系
- CAN通信帧ID如何设定?
- Spring+Redis集成+关系型数据库持久化
- 通过GUID确保winform运行唯一实例
- debug,菜鸟必备的求生技能
- ionic 访问odoo11之具体业务类api接口
- Log4j maven依赖配置
- Shell脚本编程实战一:创建按天备份的脚本工具
- gpu内存查看命令nvidia-smi
- iOS 设备的CPU架构以及查看framework支持架构
- [转]HTML DIV+CSS 命名规范大全
热门文章
- FileZilla Server安装配置教程
- vue的使用配置
- Mac 配置 php-fpm
- 「LibreOJ β Round #3」绯色 IOI(抵达)
- c和c++如何把一个整数转化为string
- 解决hibernate产生的id序列或者setXX不能同步到数据库到问题(this.hibernateTemplate.flush();hibernateTemplate.getSessionFactory().getCurrentSession().connection().commit())
- POJ 2002 几何+hash
- hdu 4710
- C#中对字符串的加密和解密
- unbuntu下安装多个JAVA JDK版本及如何切换