实现一个线程安全的单例模式,java 线程安全单例

  实现一个线程安全的单例模式,java 线程安全单例

  00-1010饥饿中文枚举单实例懒惰DCL懒惰静态内部懒惰单实例

  00-1010 Hungry-Chinese:类加载将导致创建单个实例对象。

  //问题1:为什么要加final//问题2:如果实现了序列化接口,还需要做什么来防止反序列化破坏singleton公共final类Singleton _ Hungry Implements Serializable {//问题3:为什么要设置为private?你能阻止反射创建新的实例吗?Private Singleton_hungry(){} //问题4:这个初始化能保证创建Singleton对象时的线程安全吗?私有静态Singleton_hungry实例=new Singleton _ hungry();//问题5:为什么提供一个静态方法,而不是直接将实例设置为public?说出你知道public static singleton _ hungrygetinstance(){ return instance;} public Object readResolve(){ //防止反射创建新实例?返回实例;}}}问题1:避免子类覆盖父类导致线程不安全的一些方法。2:实现readResolve方法。当从对象流ObjectInputStream中读取对象时,它将检查对象的类是否定义了readResolve方法。如果定义了,调用它返回我们要指定的对象(这里指定返回singleton对象)。3:防止通过new创建对象实例。您不能阻止反射创建新的实例。问题4:是的。静态变量在类加载时初始化,由jvm管理,可以保证线程安全。问题5:通过方法可以提高扩展性,改善饿到懒的转化,利用泛型特性,增加单体对象的控制操作。

  

目录

枚举单例{ INSTANCE}问题1:枚举单例如何限制实例数?

 

  单个实例相当于静态成员变量的枚举,当您定义几个实例时,就会有几个实例。

  问题2:枚举创建的单例时有并发问题吗?

  单个实例相当于静态成员变量的枚举,这些变量在jvm加载和管理类时被初始化,以确保线程安全。

  问题3:枚举的单线态可以被反射破坏吗?

  不能

  问题4:枚举的单例可以反序列化来销毁单例吗?

  枚举可序列化的接口,该接口可以被序列化,但不会被逆序破坏。

  问题5:枚举单身是懒还是饿?

  饥饿风格

  问题6:枚举单例。创建单例时想增加一些初始化逻辑,该怎么做?

  枚举允许构造方法。

  

饿汉式

public final类Singleton _ lazy { private Singleton _ lazy(){ } private static Singleton _ lazy INSTANCE=null;//缺点公共静态同步singleton _ lazy getinstance(){ if(instance!=null) {返回实例;} INSTANCE=new Singleton _ lazy();返回实例;}}synchronized保证了线程安全,但是锁粒度大,性能低。

 

  00-1010 Public Final类Singleton _ DCL { Private Singleton _ DCL(){ }//问题1:解释一下为什么要加volatile?私有静态可变Singleton _ DCL INSTANCE=null//问题2:对比实现3,说出这个的意思。公共静态singleton _ DCL GetInstance(){ if(instance!=null) {返回实例;} synchronized(singleton _ DCL . class){//问题3:为什么这里要加一个空判断?你之前不是判断过如果(实例!=null) {返回实例;} INSTANCE=new Singleton _ DCL();返回实例;}}}问题1:避免指令重新排序,导致赋值语句先于构造函数执行,导致对象未初始化。

  2、3:双重检查锁机制。同步代码块外的判断语句主要用于实例初始化和赋值。这个时候,实例!=null,如果多个线程试图获取单例,可以提前返回而不执行同步代码块。同步代码块内部的判断主要用于第一次初始化,当INSTANCE=null时。此时,多个线程可以尝试获取实例,只有一个线程可以进入同步代码块,其他线程都被阻挡在同步代码块之外。线程创建singleton对象后,唤醒其他线程,然后进入同步代码块,找到实例!=null,则直接返回,无需重新创建singleton对象,提高了效率。

  

枚举单例

public final class Singleton _ lazy holder { private Singleton _ lazy holder(){ }//1:是懒还是饿private static class lazy holder { static final Singleton _ lazy holder instance=new Singleton _ lazy holder();}//问题二:创建公共静态singleton _ lazy holder getinstance(){ return lazy holder . instance时是否存在并发问题;}}问题一:懒。静态类只有在被方法调用时才被初始化,并且该类被加载。

 

  问题2:无,类加载由jvm完成,是线程安全的。

  关于Java实现线程安全singleton模式的五种方法的示例代码,本文到此结束。有关Java singleton模式的更多信息,请搜索流行IT以前的文章或继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: