范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

设计模式之单例模式

  单例设计模式理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫单例模式。   使用场景处理资源访问冲突
  下面的示例中如果每个类都创建一个 Logger 实例,就可能造成日志内容被覆盖的情况。  public class Logger {   private FileWriter writer;   public Logger() {     File file = new File("log.txt");     writer = new FileWriter(file, true); //true表示追加写入   }   public void log(String message) {     writer.write(mesasge);   } } public class UserController {   private Logger logger = new Logger();   public void login(String username, String password) {     // ...省略业务逻辑代码...     logger.log(username + " logined!");   } } public class OrderController {   private Logger logger = new Logger();   public void create(OrderVo order) {     // ...省略业务逻辑代码...     logger.log("Created an order: " + order.toString());   } } 表示全局唯一类
  如果有些数据在系统中只应保存一份,那就比较适合设计为单例类。比如,配置信息类,全局 ID 生成器等。  如何实现一个单例?
  要实现一个单例,我们要考虑以下几点:  构造函数需要是 private 访问权限的,这样才能避免外部通过 new 创建实例;   考虑对象创建时的线程安全问题;   考虑是否支持延迟加载;   考虑 getInstance() 性能是否高(是否加锁)。   饿汉式public class Singleton {   private static final Singleton instance = new Singleton();   private Singleton() {}   public static Singleton getInstance() {     return instance;   } } 懒汉式
  懒汉式相对于饿汉式的优势是「支持延迟加载」 。但缺点也很明显,因为使用了synchronized 关键字导致这个方法的「并发度很低」 。如果这个单例类偶尔会被用到,那这种实现方式还可以接受。但是,如果频繁地用到,就会导致性能瓶颈,这种实现方式就不可取了。  public class Singleton {   private static Singleton instance;   private Singleton() {}   public static synchronized Singleton getInstance() {     if (instance == null) {       instance = new Singleton();     }     return instance;   } } 双重检测
  这是一种既支持延迟加载、又支持高并发的单例实现方式。  public class Singleton {   private static Singleton instance;   private Singleton() {}   public static Singleton getInstance() {     if (instance == null) {       synchronized(Singleton.class) { // 此处为类级别的锁         if (instance == null) {           instance = new Singleton();         }       }     }     return instance;   } }
  在 java1.5 以下instance = new Singleton(); 有指令重排问题,需要给instance 成员变量加上volatile 关键字,java1.5 之后不会再这个问题。  静态内部类
  这种方式利用了 Java 的静态内部类,有点类似饿汉式,但又能做到了延迟加载。
  当外部类 Singleton 被加载的时候,并不会创建 SingletonHolder 实例对象。只有当调用 getInstance() 方法时,SingletonHolder 才会被加载,这个时候才会创建 instance。insance 的唯一性、创建过程的线程安全性,都由 JVM 来保证。所以,这种实现方法既保证了线程安全,又能做到延迟加载。  public class Singleton {   private Singleton() {}   private static class SingletonHolder{     private static final Singleton instance = new Singleton();   }   public static Singleton getInstance() {     return SingletonHolder.instance;   } } 枚举
  这是一种最简单的实现方式,基于枚举类型的单例实现。这种实现方式是通过 Java 枚举类型本身的特性,保证了实例创建的线程安全性和实例的唯一性。  public enum IdGenerator {   INSTANCE;   private AtomicLong id = new AtomicLong(0);   public long getId() {     return id.incrementAndGet();   } } 如何实现线程唯一的单例?
  上面的单例类对象是进程唯一的,一个进程只能有一个单例对象。那如何实现一个线程唯一的单例呢?
  假设 IdGenerator 是一个线程唯一的单例类。在线程 A 内,我们可以创建一个单例对象 a。因为线程内唯一,在线程 A 内就不能再创建新的 IdGenerator 对象了,而线程间可以不唯一,所以,在另外一个线程 B 内,我们还可以重新创建一个新的单例对象 b。
  我们通过一个 ConcurrentHashMap 来存储对象,其中 key 是线程 ID,value 是对象。这样我们就可以做到,不同的线程对应不同的对象,同一个线程只能对应一个对象。实际上,Java 语言本身提供了 ThreadLocal 工具类,可以更加轻松地实现线程唯一单例。  public class IdGenerator {   private AtomicLong id = new AtomicLong(0);   private static final ConcurrentHashMap instances           = new ConcurrentHashMap<>();   private IdGenerator() {}   public static IdGenerator getInstance() {     Long currentThreadId = Thread.currentThread().getId();     instances.putIfAbsent(currentThreadId, new IdGenerator());     return instances.get(currentThreadId);   }   public long getId() {     return id.incrementAndGet();   } }

阿里巴巴能否聘用王某文妻子?想到她的气愤很同情阿里女员工被侵犯事件,基本尘埃落定。此事件后期,王某文妻子四处奔波,调查取证,并发文讲明情况,赢得舆论支持,让阿里扳回几分,挽回了一些声誉。鉴于此,有人呼吁阿里能否录用王妻做员工?字节向阿里宣战,抖音电商剑指天猫,电商领域要变天了?电商直播作为目前最火热的商品销售渠道,目前已经对传统电商平台的运营造成冲击。此前,抖音方面对电商发展有自己的看法,也曾透露要建设自己的专属APP。而抖音电商APP似乎真的要落地了,阿里女员工案中的另一位妻子,也值得点赞我很清楚,写下这篇文字,会招来更多的反驳和批判,挨更多的骂,但有些事还是要说。作为一个专注为女性群体发声的母婴平台,深知一个幸福的家庭,对孩子的成长有多重要,所以夫妻相处家庭关系都8256GB仅1699,5000mAh大电池加持,OPPO这次走心了OPPO今年在市场中的表现还是非常值得称赞的,不仅推出了很多新机型,还在第二季度全球智能手机销量排行榜中取得了第四名的好成绩。OPPO旗下开发了很多产品线,比如A系列R系列以及K系8月新能源车销量前五,MINIEV再度霸榜,ModelY成为合资独苗千呼万唤,8月份销量排行榜终于出炉。虽然当今市场竞争日益残酷,但依然还是有部分车型成为胜利者。下面我们就将揭晓上个月新能源领域销量前五得主,令人意外的是,自主车型强势霸占四个席位,解决虚实鸿沟问题,以AR平台构建超实境智慧空间来源人民网9月9日,AR公司亮风台表示,AR平台HiARSpace全新升级,明确打造超实境智慧空间的目标。同时重磅发布5GAR智能眼镜HiARH100以及物理世界的AR便利贴与记事冰箱购买另类思路大厂电商平台都这么选冰箱前两天跟朋友小聚得知了一件趣事有一天都快凌晨1点了,小两口要准备睡觉了,突然不知何处总是不规律地响起吱吱吱的声音。这不明来历的声音把小两口吓得够呛,找来找去最后才发现是冰箱的螃蟹发八月销量大盘持续下滑,新能源逆势而上,比亚迪表现亮眼文二哥头前天,乘联会发布了8月中国汽车市场的分析报告,数据显示8月中国汽车市场产销均出现下滑,8月狭义乘用车产量为148。4万辆,同比下降11。2,环比下降2。7狭义乘用车销量为1京东商城!客户账户安全形同虚设!投诉无门!消费者安全无保障京东商城,全国规模排名第二的网络商城!客户的账号竟然可以随意被多人共同使用!这样的平台,如何保障消费者的安全!本人于多年前使用一个手机号码绑定注册京东账号!多年后该手机号不再使用,富士康紧急扩招20万员工,单人奖金1。3万背后印度制造一败涂地富士康员工缺口高达20万富士康回来了!越南工厂停产印度工厂停产,而被寄予厚望的美国工厂现在还没建完。在全球一片混乱的时候,中国制造成为了唯一的亮点。曾经把生产线迁移到东南亚的富士康8000mAh大电池八核芯片指纹解锁,8GB128GB版跌至899元有的用户喜欢玩游戏,选择了游戏手机有的用户喜欢拍照,于是选择了拍照手机而有些用户不玩游戏不拍照,平时就打电话微信聊天和刷网页等,做一些简单的操作,这时选择续航手机会比较好一些,就像
新世界七大奇迹大兴机场,都用了哪些物联网黑科技?9月25日,备受瞩目的北京大兴国际机场正式投入运营,凤凰展翅,振翅高飞!作为民航局打造的智慧机场30样板工程,北京大兴国际机场利用物联网技术云计算及存储个人智能终端虚拟可视化技术等要颜值有颜值,要保鲜有保鲜,松下这两个款日本进口冰箱谁不爱?冰箱电视洗衣机,曾经中国消费者们心目中的家电三大件,已随着消费升级的步伐,悄悄迎来了新一轮的革新。在经过日新月异的发展之后,家电从功能延展到颜值,在进行了多轮进化升级后,时至今日,干湿清洁,功能齐活吉米轻便三合一全屋吸尘洗地一体机体验开始之前,先来聊聊家里最近的情况,有娃之后,家里领导拒绝了长辈过来帮忙,坚持自己带娃,但全职居家带娃势必难以兼顾一些家务,尤其现在宝宝特别爱爬,有时候都会从爬行垫的护栏里伸出手摸外鹿晗带老人机坐高铁尴尬了!网友喊话别给老人机贴社死标签当下,功能机仍然存活于市场,这并不是因为一些手机厂商的坚持,而是用户群体的需求所致。即便智能手机已经普遍应用了,但当下仍然有一部分老年人对功能机青睐有加,但不乏也有一些年轻人,这不荣耀60背部彻底曝光,颜值依旧抗打,前置相机和屏幕大幅提升荣耀60系列已经确定将会在12月1号发布,目前官方也在持续预热当中,它的背部设计已经得到了曝光,类似星空的造型确实美不胜收。相机设计与荣耀50有相似之处,不过看双环的装饰有了新的改哪种听歌app不开会员可以播放比较全面的各种歌曲?波老师之前推过好几次好用听歌APP特辑,效果都不错,今天波老师整理了一下手上比较好用的应用软件推荐给大家!QQ音乐波老师推荐给大家QQ音乐是VIP版本,直接登录享受全部功能,波老师蹭网人数多导致网速很慢,改密码后邻居大妈跑来我家问,该怎么办?蹭网人数多,导致网速很慢,改密码后邻居大妈跑来我家问,那你就大声问她为什么你蹭我家的网可以理直气壮,梁静茹给你的勇气吗?你给我家网络交网费了吗?没有给我家网络缴费的话,密码无可奉告联想有核心技术吗,你认为有,就发表出来,让大家了解一下?这真是个好问题,联想的核心技术就是组装电脑机箱,并且,还是买办资本的代表,享受着国家政策福利,压榨着国内改革开放紅利。口口声声一再表明,自己不是中国企业。可笑,更可耻。而更可恨的是苹果电脑的什么地方吸引你?本人一名iOS开发者,使用苹果设备较多,接触的时间也较长,差不多有10年使用经验了。说说我的经历。我自己是从Java开发转到iOS开发的。目前也还是这个职业。记得当时还在做Java电视面板价格继续走低,双十二电视价格将创新低面板价格持续一年的上涨之后在今年7月迎来下跌,相比上涨的速度,这次下跌的速度来的非常快幅度也非常大。截止到今年10月,32寸面板跌幅超过42,43寸面板跌幅超过33,55寸的大屏面37安卓手机存监听用户隐患,联发科曝手机芯片漏洞,紧急发放补丁北京时间11月25日消息,安全厂商CheckPoint今天披露,由联发科设计的片上系统音频处理固件存在一处安全漏洞,恶意应用可以秘密将用户手机变成监听工具。CheckPoint估计