单线程下的单例模式

定义:

确保一个类只有一个实例,并提供一个全局访问点。

单例代码:

package wfb.pattern;public class Singleton {private static Singleton instance;private Singleton() {System.out.println("实例化了一个新的单例");}public static Singleton getInstance() {if(instance == null) {instance = new Singleton();}return instance;}
}

测试代码:

package wfb.patthernTest;import org.junit.Test;import wfb.pattern.Singleton;public class SingletonTest {@Testpublic void testSinglon1() {Singleton singlon1 = Singleton.getInstance();Singleton singlon2 = Singleton.getInstance();}@Testpublic void testSingleton2() throws Exception {while(true) {new Thread(new Runnable() {public void run() {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}Singleton singlon = Singleton.getInstance();}}).start();}}
}

测试结果:

单线程 :

多线程 :

原因分析:

如果多个线程同时走到if(instance == null)的判断语句,会因为还未创建实例而进入到实例化代码,从而导致了单件被实例化多次。换句话说,根本原因是if(instance == null) instance = new Singleton()这两步操作不是原子性的。
为此,我们有两种解决方法:
1.在类加载后就初始化instance,之后就不在需要创建实例了。
2.用同步包起这两步操作,从而使得它具有原子性。
懒汉和饿汉模式就这两种方法分别给出了多线程下单例模式的解决方案。

多线程下的单例模式

饿汉代码:

package wfb.pattern;
//饿汉模式通过提前初始化一个实例来解决多线程问题
public class SingletonHungry {private static SingletonHungry instance = new SingletonHungry();private SingletonHungry() {System.out.println("实例化了一个新的单例");}public static SingletonHungry getInstance() {return instance;}
}

饿汉测试:

@Testpublic void testSingletonHungry() throws Exception{while(true) {new Thread(new Runnable() {public void run() {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}SingletonHungry singletonHungry = SingletonHungry.getInstance();}}).start();}}

饿汉结果:

懒汉代码:

package wfb.pattern;
//懒汉模式通过同步解决多线程问题。
public class SingletonLazy {private static SingletonLazy instance;private SingletonLazy() {System.out.println("实例化了一个新的单例");}public static SingletonLazy getInstance() {if(instance != null) return instance;//为了增加效率,当拥有了实例后,我们直接返回实例。因为拥有了实例后,状态就跟饿汉一致了,显然不会发生线程问题。synchronized (SingletonLazy.class) {//因为是静态方法,所以用类做同步锁if(instance == null) instance = new SingletonLazy();return instance;}}
}

懒汉测试:

@Testpublic void testSingletonLazy() throws Exception{while(true) {new Thread(new Runnable() {public void run() {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}SingletonLazy singletonLazy = SingletonLazy.getInstance();}}).start();}}

懒汉结果:

java 单例模式 懒汉和饿汉相关推荐

  1. Java单例模式--------懒汉式和饿汉式

    Java单例模式--------懒汉式和饿汉式 单件模式用途: 单件模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用. 单件模式能够保证某一类型对象在系统中的唯一性,即某类在系统 ...

  2. 单例模式懒汉、饿汉和登记

    转载自  JAVA设计模式之单例模式 本文继续介绍23种设计模式系列之单例模式. 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记 ...

  3. 【C++】单例模式(懒汉、饿汉)

    1.什么是单例模式? 顾名思义,单例模式就是在这个单例类确保只有一个对象被创建.也就是说这个类只能实例化一个对象. 特征:1.单例类最多只能有一个实例: 2.单例类必须自己创建自己唯一的实例: 3.单 ...

  4. 单例模式——懒汉与饿汉

    前言:设计模式是在不断编程中前人所总结的"兵书",将可能面对的大部分编程需求归纳总结为固定的模式,而单例模式则是最常见的设计模式之一. 设计模式 设计模式(Design Patte ...

  5. Java单例模式--懒汉式和饿汉式(Demo)

    你好我是辰兮,很高兴你能来阅读,本篇文章为大家讲解Java单例模式,相关的更多面试知识已经提前整理好文章可以阅读学习,分享获取新知,希望对Java初学者有帮助. 1.JAVA基础面试常考问题 : JA ...

  6. Java单例模式【懒汉式饿汉式】

    目录 一. 单例模式的解释 二. 实现方法 2.1 饿汉式 2.1.1饿汉式的实现代码 2.2 懒汉式 2.2.1懒汉式的实现代码 三. 单例设计模式的好处 3.1单例模式的应用场景 一. 单例模式的 ...

  7. Java多线程案例之单例模式(懒汉,饿汉,枚举)

    ⭐️前面的话⭐️ 本篇文章将介绍Java多线程中的几个典型案例之单例模式,所谓单例模式,就是一个类只有一个实例对象,本文将着重介绍在多线程的背景下,单例模式的简单实现.

  8. java单例设计模式懒汉_Java设计模式之单例设计模式(懒汉、饿汉)

    [toc] Java设计模式之单例设计模式(懒汉.饿汉) 相信面试过的初中级Java开发的朋友可能都有遇到过单例设计模式的笔试题吧,如果之前没有背下来或者不理解,可以看看下面这篇文章,应该足够应付笔试 ...

  9. 单例模式的原理/懒汉模式/饿汉模式以及不同版本的单例模式程序

    单例模式 单例模式定义 懒汉模式与饿汉模式 懒汉模式 饿汉模式 懒汉模式和饿汉模式的区别 懒汉模式的不同版本 版本一 版本二 版本三 版本四 单例模式定义 保证一个类仅有一个实例,并提供一个该实例的全 ...

最新文章

  1. iphone html邮件发送,html – iPhone邮件:由于锚标记,表格不会延伸到100%?
  2. 当前页面怎么调用子集iframe页面的方法
  3. flex java 全局拦截_flex + java 过滤敏感词
  4. 线程的应用-继承Thread类创建线程
  5. BZOJ2809 dispatching 【可并堆】
  6. java怎吗从磁盘读文件_编写一个Java应用程序,该程序使用FileInputStream类,实现从磁盘读取本应用程序源代码文件,并将文件内容显示在屏幕上。...
  7. ServiceMesh最火项目:Istio架构解析
  8. easyui tree动态加载_动态路由:Gin vs SpringMVC
  9. 统计剩余字数(jq版)
  10. 最新Unity 3D游戏开发学习资料集合
  11. 中投、汇金、四大国有资产管理公司、华融、长城、东方、信达
  12. 色环在线计算机,多功能电子计算软件(eTools)
  13. 微博做内容和收入来源
  14. 链接无线路由器后局域网无法连接服务器,局域网部分电脑连接路由器(交换机)后无法上网该怎么解决?...
  15. Android shell脚本自动启动app,关闭app,遇到crash自动停止
  16. Charles工具使用
  17. 【XSY-Contest2618.Problem A】抢夺
  18. 大数据时代,AIoT在智慧社区的深度应用
  19. 运营商网络之163/169的概念
  20. mysql(四/2)表的操作

热门文章

  1. Linux-CentOS7离线安装RabbitMq
  2. 关于加载fonts.useso.com导致页面加载过慢问题
  3. quartus II【如何进行顶层设计】
  4. 卸载后以前拍的视频会删除吗_95后不倒翁小姐姐:5天涨粉100万,带火一座长安城!...
  5. bulk这个词的用法_bulk是什么意思_bulk怎么读_bulk翻译_用法_发音_词组_同反义词_(大)体积-新东方在线英语词典...
  6. 用象棋的思维趣说IT人的职业发展和钱途
  7. java导出xmind_如何使用Java解析XMind文件
  8. HiveServer2 频繁宕机根本原因分析
  9. 一个月的电子助理工程师的实习体验
  10. 自学java,如何快速地找到工作