如何写一个繁难的单例形式 (如何写一个繁体字)

如何写一个繁难的单例形式 (如何写一个繁体字)

本文目录导航:

如何写一个繁难的单例形式?

一、基本的成功思绪:

单例的成功关键是经过以下两个步骤:

1、将该类的结构方法定义为私有方法,这样其余处的代码就不可经过调用该类的结构方法来实例化该类的对象,只要经过该类提供的静态方法来失掉该类的惟一实例;

2、在该类内提供一个静态方法,当咱们调用这个方法时,假设类持有的援用不为空就前往这个援用,假设类坚持的援用为空就创立该类的实例并将实例的援用赋予该类坚持的援用。

二、示范如下:

1、枚举成功单例:

2、懒汉式线程不安保:

3、懒汉式线程安保:

4、饿汉式:

5、双重校验锁:

6、静态外部类:

裁减资料:

一、单列形式简介:

单例形式是设计形式中最繁难的方式之一。

这一形式的目标是使得类的一个对象成为系统中的惟一实例。

要成功这一点,可以从客户端对其启动实例化开局。

因此须要用一种只准许生成对象类的惟一实例的机制,“阻止”一切想要生成对象的访问。

经常使用工厂方法来限度实例化环节。

这个方法应该是静态方法(类方法),由于让类的实例去生成另一个惟一实例毫有意义。

二、懒汉与饿汉:

1、懒汉方式:指全局的单例实例在第一次性被经常使用时构建。

2、饿汉方式:指全局的单例实例在类装载时构建。

三、单例形式的三要点:

1、某个类只能有一个实例。

2、它必定自行创立这个实例。

3、它必定自行向整个系统提供这个实例。

四、优缺陷:

1、优势:

①实例控制:单例形式会阻止其余对象实例化其自己的单例对象的正本,从而确保一切对象都访问惟一实例。

②灵敏性:由于类控制了实例化环节,所以类可以灵敏更改实例化环节。

2、缺陷:

①开支:只管数量很少,但假设每次对象恳求援用时都要审核能否存在类的实例,将依然须要一些开支。

可以经过经常使用静态初始化处置此疑问。

②或者的开发混杂:经常使用单例对象(尤其在类库中定义的对象)时,开发人员必定记住自己不能经常使用new关键字实例化对象。

由于或者不可访问库源代码,因此运行程序开发人员或者会异常发现自己不可间接实例化此类。

③对象生定期:不能处置删除单个对象的疑问。

在提供内存治理的言语中(例如基于 Framework的言语),只要单例类能够造成实例被敞开调配,由于它蕴含对该实例的私有援用。

在某些言语中(如 C++),其余类可以删除对象实例,但这样会造成单例类中出现悬浮援用。

参考资料:网络百科单列形式

设计形式之单例形式

本文开局整个设计形式的系列学习,宿愿经过始终的学习,可以对设计形式有全体的把握,并在名目中依据实践的状况加以应用。

单例形式是指一个类仅准许创立其自身的一个实例,并提供对该实例的访问权限。

它蕴含静态变量,可以容纳其自身的惟一和私有实例。

它被运行于这种场景——用户宿愿类的实例被解放为一个对象。

在须要单个对象来协调整个系统时,它会很有协助。

1、单例类只能有一个实例 2、单例类必定自己创立自己的惟一实例 3、单例类必定给其余一切对象提供这一实例 1.尽量经常使用懒加载 2.双重检索成功线程安保 3.结构方法为private 4.定义静态的Singleton instance对象和getInstance()方法 单例形式至少有六种写法。

作为一种关键的设计形式,单例形式的好处有: 1、控制资源的经常使用,经过线程同步来控制资源的并发访问 2、控制实例的发生,以到达浪费资源的目标 3、控制数据的共享,在不建设间接关联的条件下,让多个不关系的进程或线程之间成功通讯 Singleton经过将结构方法限定为private防止了类在外部被实例化,在同一个虚构机范畴内,Singleton的惟一实例只能经过getInstance()方法访问。

但其实经过Java反射机制是能够实例化结构方法为private的类的,那基本上会使一切的Java单例成功失效。

只管也是只要一个线程能够口头,假设线程B先口头,线程B取得锁,线程B口头完之后,线程 A取得锁,然而此时没有审核singleton能否为空就间接口头了,所以还会出现两个singleton实例的状况。

既然懒汉式是非线程安保的,那就要改良它。

最间接的想法是,给getInstance方法加锁不就好了,然而咱们不须要给方法所有加锁啊,只要要给方法的一局部加锁就好了。

基于这个思考,引入了双检锁(Double Check Lock,简称DCL)的写法: 经常使用volatile 的要素: 关于JVM而言,它口头的是一个个Java指令。

在Java指令中创立对象和赋值操作是离开启动的,也就是说instance = new Singleton();语句是分两步口头的。

然而JVM并不保障这两个操作的先后顺序,也就是说有或者JVM会为新的Singleton实例调配空间, 而后间接赋值给instance成员,而后再去初始化这个Singleton实例。

这样就使出错成为了或者,咱们依然以A、B两个线程为例: 加载一个类时,其外部类不会同时被加载。

一个类被加载,当且仅当其某个静态成员(静态域、结构器、静态方法等)被调用时出现。

枚举类成功单例形式是 effective java 作者竭力介绍的单例成功形式,由于枚举类型是线程安保的,并且只会装载一次性,设计者充沛的应用了枚举的这个个性来成功单例形式,枚举的写法十分繁难,而且枚举类型是所用单例成功中惟逐一种不会被破坏的单例成功形式。

由于枚举类没有结构方法,可以防止反序列化操作。

1、除枚举方式外, 其余方法都会经过反射的方式破坏单例,反射是经过调用结构方法生成新的对象,所以假设咱们想要阻止单例破坏,可以在结构方法中启动判别,若已有实例, 则阻止生成新的实例,处置方法如下: 2、假设单例类成功了序列化接口Serializable, 就可以经过反序列化破坏单例,所以咱们可以不成功序列化接口,假设非得成功序列化接口,可以重写反序列化方法readResolve(), 反序列化时间接前往关系单例对象。

Runtime是一个典型的例子,看下JDK API关于这个类的解释每个Java运行程序都有一个Runtime类实例,使运行程序能够与其运转的环境相衔接,可以经过getRuntime方法失掉以后运转时。

运行程序不能创立自己的Runtime类实例。

,这段话,有两点很关键: 1、每个运行程序都有一个Runtime类实例 2、运行程序不能创立自己的Runtime类实例 只要一个、不能自己创立,是不是典型的单例形式?看一下,Runtime类的写法: 为了浪费系统资源,有时须要确保系统中某个类只要惟逐一个实例,当这个惟一实例创立成功之后,咱们不可再创立一个同类型的其余对象,一切的操作都只能基于这个惟一实例。

为了确保对象的惟一性,咱们可以经过单例形式来成功。

单例形式运行的场景普通发如今以下条件下: (1)资源共享的状况下,防止由于资源操作时造成的性能或损耗等。

如上述中的日志文件,运行性能。

(2)控制资源的状况下,繁难资源之间的相互通讯。

如线程池等。

关于单例形式的漫画剖析:单例形式的优缺陷、留意事项、经常使用场景

面试突击50:单例形式有几种写法?

单例形式是面试中的常客了,它的经常出现写法有 4 种:饿汉形式、懒汉形式、静态外部类和枚举,接上去咱们逐一来看。

1.饿汉形式

饿汉形式也叫预加载形式,它是在类加载时间接创立并初始化单例对象,所以它并不存在线程安保的疑问。它是依托 ClassLoader 类机制,在程序启动时只加载一次性,因此不存在线程安保疑问,它的实现代码如下:

public class Singleton {// 1.防止外部间接 new 对象破坏单例形式private Singleton() {}// 2.经过私有变量保留单例对象private static Singleton instance = new Singleton();// 3.提供公共失掉单例对象的方法public static Singleton getInstance() {return instance;}}

优势:成功繁难、不存在线程安保疑问。

缺陷:类加载时就创立了对象,创立之后假设没被经常使用,就形成了资源糜费的状况。

2.懒汉形式

懒汉形式和饿汉形式正好是同样的,所谓的懒汉形式也就是懒加载(提前加载),指的是它只要在第一次性被经常使用时,才会被初始化,它的实现代码如下:

public class Singleton {// 1.防止外部间接 new 对象破坏单例形式private Singleton() {}// 2.经过私有变量保留单例对象private static volatile Singleton instance = null;// 3.提供公共失掉单例对象的方法public static Singleton getInstance() {if (instance == null) { // 第一次性效验synchronized () {if (instance == null) { // 第二次效验instance = new Singleton();}}}return instance;}}

懒汉形式经常使用的是双重效验锁和 volatile 来保障线程安保的,从上述代码可以看出,无论是饿汉形式还是懒汉形式,它们的成功步骤都是一样的:

创立一个私有的结构方法,防止其余调用的中央间接 new 对象,这样创立进去的对象就不是单例对象了。

创立一个私有变量来保留单例对象。

提供一个公共的方法前往单例对象。

懒汉形式相比于饿汉形式来说,不会形成资源的糜费,但写法要复杂一些。

3.静态外部类

静态外部类既能保障线程安保,又能保障懒加载,它只要在被调用时,才会经过 ClassLoader 机制来加载和初始化外部静态类,因此它是线程安保的,此形式的实现代码如下:

public class Singleton {// 1.防止外部间接 new 对象破坏单例形式private Singleton() {}// 2.静态外部类private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}// 3.提供公共失掉单例对象的方法public static final Singleton getInstance() {return ;}}4.枚举

枚举也是在第一次性被经常使用时,才会被 Java 虚构机加载并初始化,所以它也是线程安保的,且是懒加载的,它的实现代码如下:

public enumEnumSingleton {INSTANCE;public EnumSingleton getInstance(){return INSTANCE;}}总结

单例形式实用于经常被访问的对象,或是创立和销毁须要调用少量资源和期间的对象,经常使用单例形式可以防止频繁创立和销毁对象。

单例形式的罕用成功方法有 4 种:饿汉形式、懒汉形式、静态外部类和枚举。

从写法的繁复性、线程安保性和代码的易懂性等方面综合来看,博主比拟介绍经常使用枚举或懒汉形式来成功单例形式。

是非审之于己,毁誉听之于人,得失安之于数。

群众号:Java面试真题解析

面试合集:原文:

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

28阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

26阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

26阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

26阅读