java单例模式 订阅
java单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。 展开全文
java单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
信息
外文名
java Singleton pattern
特    点
只能有一个实例等
分    类
懒汉式、饿汉式、登记式单例
中文名
java单例模式
使用目的
避免不一致状态,避免政出多头
互联网技术概念范围
单例模式有以下特点:  1、单例类只能有一个实例。  2、单例类必须自己创建自己的唯一实例。  3、单例类必须给所有其他对象提供这一实例。  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。首先看一个经典的单例实现。[java]view plaincopyprint?Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)但是以上实现没有考虑线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上实现并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例。[java]view plaincopyprint?[java]view plaincopyprint?运行结果:结论:由结果可以得知单例模式为一个面向对象的应用程序提供了对象惟一的访问点,不管它实现何种功能,整个应用程序都会同享一个实例对象。1.饿汉式单例类[java]view plaincopyprint?  2.懒汉式单例类[java]view plaincopyprint?[java]view plaincopyprint?
收起全文
精华内容
下载资源
问答
  • Java单例模式

    2014-10-17 21:17:43
    java单例模式讲解,通熟易懂!没有接触过单例模式的可以看看!挺不错的!
  • Java 单例模式

    千次阅读 2019-08-29 17:22:17
    HOW2J学习到的Java单例模式的笔记 HOW2J对应的源笔记 饿汉式单例模式 // An highlighted block class Hero{ private Hero(){ } private static Hero instance = new Hero(); public static ...

    Java 单例模式

    HOW2J学习到的Java单例模式的笔记
    更多相关教程分享

    饿汉式单例模式

    
    // An highlighted block
    class Hero{
    
    	private Hero(){
    		}
    
    	private static Hero instance = new Hero()public static Hero getInstance(){
    		return instance;
    		} 
    
    }
    
    

    懒汉式单例模式

    
    // An highlighted block
    class Hero{
    
    	private Hero(){
    		}
    
    	private static Hero instance;
    
    	public static Hero getInstance(){
    		if(instance == null){
    			instance = new Hero();
    			}
    		return instance;
    	} 
    
    }
    
    

    懒汉与饿汉区别

    饿汉式是无论用不用都要加载,可能会浪费性能,启动时可能较为费时
    懒汉式只有当用到是才加载,启动时可能略快

    展开全文
  • java单例模式

    2015-08-10 17:04:17
    java单例模式开发的7中写法,网上搜索的,可以看看
  • java 单例模式

    2017-02-03 16:02:37
    本人用java写的单例模式的小demo,源码里有详细的注释,保证一看就懂。欢迎大牛指点。
  • JAVA单例模式

    2013-11-14 14:47:54
    一、单例模式的介绍 二、单例模式的特点 三、单例模式的应用 四、单例模式使用的注意 五、单例模式的举例
  • Java单例模式示例

    2020-08-10 19:49:42
    Java单例模式示例
  • Java单例模式简单示例

    2020-08-30 04:12:59
    主要介绍了Java单例模式,结合实例形式简单分析了java单例模式的定义与使用技巧,需要的朋友可以参考下
  • Java 单例模式 懒汉模式 //懒汉式 多线程中不可以保证是一个对象
  • 主要介绍了Java单例模式和多例模式,结合实例形式分析了java单例模式与多例模式的定义及使用技巧,需要的朋友可以参考下
  • java单例模式——详解JAVA单例模式及8种实现方式

    千次阅读 多人点赞 2020-10-23 15:39:01
    ## 单例模式是最简单也是最基础的设计模式之一,下边一起学习一下单例模式! 一.单例模式的定义: 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志...

    ## 单例模式是最简单也是最基础的设计模式之一,下边一起学习一下单例模式!

    一.单例模式的定义:
    单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

    二.单例模式的特点
     1、单例类只能有一个实例。
     2、单例类必须自己创建自己的唯一实例。
     3、单例类必须给所有其他对象提供这一实例。
    单例模式保证了全局对象的唯一性,比如系统启动读取配置文件就需要单例保证配置的一致性。

    三.线程安全问题:
    一方面在获取单例的时候,要保证不能产生多个实例对象,后面会详细讲到五种实现方式;
    另一方面,在使用单例对象的时候,要注意单例对象内的实例变量是会被多线程共享的,推荐使用无状态的对象,不会因为多个线程的交替调度而破坏自身状态导致线程安全问题,比如我们常用的VO,DTO等(局部变量是在用户栈中的,而且用户栈本身就是线程私有的内存区域,所以不存在线程安全问题)。

    四.实现单例模式的八种方式:
    1.饿汉式(静态常量)【可用】
    优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
    缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。
    在这里插入图片描述

    2.饿汉式(静态代码块)【可用】
    这种方式和上面的方式其实类似,只不过将类实例化的过程放在了静态代码块中,也是在类装载的时候,就执行静态代码块中的代码,初始化类的实例。优缺点和上面是一样的。
    在这里插入图片描述

    3.懒汉式(线程不安全)【不可用】
    这种写法起到了Lazy Loading的效果,但是只能在单线程下使用。如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式。
    在这里插入图片描述

    4.懒汉式(线程安全,同步方法)【不推荐用】
    解决上面第三种实现方式的线程不安全问题,做个线程同步就可以了,于是就对getInstance()方法进行了线程同步。
    缺点:效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例,直接return就行了。方法进行同步效率太低要改进。
    在这里插入图片描述

    5.懒汉式(线程安全,同步代码块)【不可用】
    由于第四种实现方式同步效率太低,所以摒弃同步方法,改为同步产生实例化的的代码块。但是这种同步并不能起到线程同步的作用。跟第3种实现方式遇到的情形一致,假如一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。
    在这里插入图片描述

    6.双重检查【推荐使用】
    Double-Check概念对于多线程开发者来说不会陌生,如代码中所示,我们进行了两次if (singleton == null)检查,这样就可以保证线程安全了。这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null),直接return实例化对象。
    优点:线程安全;延迟加载;效率较高。
    在这里插入图片描述

    7.静态内部类【推荐使用】
    这种方式跟饿汉式方式采用的机制类似,但又有不同。两者都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的地方在饿汉式方式是只要Singleton类被装载就会实例化,没有Lazy-Loading的作用,而静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。
    类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
    优点:避免了线程不安全,延迟加载,效率高。
    在这里插入图片描述

    8.枚举【推荐使用】
    借助JDK1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。
    在这里插入图片描述

    五.单例模式的优点
    系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
    六.单例模式的缺点
    当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new,可能会给其他开发人员造成困扰,特别是看不到源码的时候。
    七.单例模式的使用场景
    • 需要频繁的进行创建和销毁的对象;
    • 创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
    • 工具类对象;
    • 频繁访问数据库或文件的对象。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 204,737
精华内容 81,894
关键字:

java单例模式

java 订阅