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;
}
}
这样的优化,使我们更优雅地适用代码。可是也带来了一定的问题,就是我们对对象的类型有了模糊的概念,所以在工作中,还是建议保留双锁模式,对一些工具类则能够採取枚举类型优化,简化我们的代码与逻辑。
总结:
细节的优化。就像雕琢一件艺术品,我们接触的高人越多。这种思想就越浓厚,所以,我们经常推断一个人事怎么的品格与素养,通过他接触的人。朋友就能够猜測出来,而计算机内。也是如此,我们接触的优秀框架多了。自己自然就是优秀的设计师。
java集群优化——多线程下的单例模式的更多相关文章
- Java集群优化——dubbo+zookeeper构建高可用分布式集群
不久前,我们讨论过Nginx+tomcat组成的集群,这已经是非常灵活的集群技术,但是当我们的系统遇到更大的瓶颈,全部应用的单点服务器已经不能满足我们的需求,这时,我们要考虑另外一种,我们熟悉的内容, ...
- Java集群优化——使用Dubbo对单一应用服务化改造
之前,我们讨论过Nginx+tomcat组成的集群,这已经是非常灵活的集群技术,但是当我们的系统遇到更大的瓶颈,全部应用的单点服务器已经不能满足我们的需求,这时,我们要考虑另外一种,我们熟悉的内容,就 ...
- java集群优化——ORM框架查询优化原理
众所周知,当下的流行的企业级架构中,ORM一直是最基础的部分,在架构设计的底层.对逻辑层提供面向对象的操作支持,而事实总是和我们预想的有所偏差,ORM在提供了较好的操作体验时,也流失了一部分原生SQL ...
- Elasticsearch 集群优化-尽可能全面详细
Elasticsearch 集群优化-转载参考1 基本配置 基本配置,5台配置为 24C 125G 17T 的主机,每台主机上搭建了一个elasticsearch节点. 采用的elasticsearc ...
- java集群
java集群 分类: java学习2011-05-12 09:12 7531人阅读 评论(9) 收藏 举报 java服务器负载均衡ejb集群数据库 序言 越来越多的关键应用运行在J2EE(Java 2 ...
- 【架构师之路】集群/分布式环境下5种session处理策略
[架构师之路]集群/分布式环境下5种session处理策略 转自:http://www.cnblogs.com/jhli/p/6557929.html 在搭建完集群环境后,不得不考虑的一个问题就是 ...
- HDFS集群优化篇
HDFS集群优化篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统级别优化 1>.优化文件系统(推荐使用EXT4和XFS文件系统,相比较而言,更推荐后者,因为XF ...
- Kafka集群优化篇-调整broker的堆内存(heap)案例实操
Kafka集群优化篇-调整broker的堆内存(heap)案例实操 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看kafka集群的broker的堆内存使用情况 1>. ...
- Redis源码阅读(六)集群-故障迁移(下)
Redis源码阅读(六)集群-故障迁移(下) 最近私人的事情比较多,没有抽出时间来整理博客.书接上文,上一篇里总结了Redis故障迁移的几个关键点,以及Redis中故障检测的实现.本篇主要介绍集群检测 ...
随机推荐
- scanf_s获取参数,清空缓冲区,判断是否读取成功
#include<stdio.h> int main() { ]; ) { printf("Please input:\n"); ); ) { printf(" ...
- [CF] 950A Left-handers, Right-handers and Ambidexters
A. Left-handers, Right-handers and Ambidexters time limit per test1 second memory limit per test256 ...
- NGINX模块(一)
[NGINX核心模块] 1.主模块 该模块包含一些Nginx的基本控制功能. 指令1:daemon 语法:daemon on | off 默认值:on daemon off; 说明:生产环境中不要使用 ...
- selenium之文件上传
文件上传是所有UI自动化测试都要面对的一个头疼问题,今天博主在这里给大家分享下自己处理文件上传的经验,希望能够帮助到广大被文件上传坑住的seleniumer. 首先,我们要区分出上传按钮的种类,大体上 ...
- bzoj 2721[Violet 5]樱花 数论
[Violet 5]樱花 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 671 Solved: 395[Submit][Status][Discuss ...
- PHP复制和移动目录
<?php //重命名一个文件或目录 rename("phpmyadmin", "phpadmin");//重命名成phpadmin /* * $dirs ...
- mapStruct笔记
背景 mapStruct 是一个方便对象转换的工具,类似的工具还有 Dozer, BeanUtils. 实现 mapStruct的核心是在编译期生成基于转换规则的 Impl 文件,运行时直接调用 Im ...
- 【BZOJ1225】求正整数(数论)
题意:对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m. n<=50000 思路:记得以前好像看的是maigo的题解 n即为将m分解为质数幂次的乘积后的次数+1之积 经检验只需要 ...
- BZOJ1710: [Usaco2007 Open]Cheappal 廉价回文
len<=2000的字符串上,给出删掉和添加每种字符的花费,求把字符串变成回文串的最小花费. 首先每个字符添加和删除是一样的,因此花费在添加和删掉每个字符的花费中取小的. 如果每个字符的花费都是 ...
- 学.net必学的东西 10项【不知道我能不能学这么多,!- -,光程序编辑我都累死了】
原文发布时间为:2008-10-30 -- 来源于本人的百度文章 [由搬家工具导入] 10项.NET必学的技术2007年08月28日 星期二 14:58 1、WCF (Windows Communic ...