`
maozhetao
  • 浏览: 619 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

几种单例模式

阅读更多

单例模式1:

    此种模式在多线程模式下会有问题

public class Singleton{
  //私有静态实例,防止被引用,此处设置为null,是为了延迟加载
  private static Sigleton instance = null;
  
  //私有构造方法,防止被实例化
  private Singleton(){

  }
  
  //静态方法,创建实例
  public static Singleton getInstance(){
    if(instance == null){
      instance = new Singleton();
    }
  }
  
  //若该类被用于序列化,可以保证序列号前后保持一致
  public Object readResolve(){
    return instace;
  }
}

 ==================================华丽丽的分割线====================================

单例模式2

    能解决多线程的问题;

    但又会出现其它问题:由于java中创建对象和赋值是分开执行的,所以对于instance=new Singleton()其实是分开两步的,java不保证其中的执行顺序,可能会出现JVM为新的Singleton实例分配空间,然后直接赋值给成员instance,然后再去初始化instance实例,这样就有可能出错了

    例子:A,B两个线程同时进入第一个if判断

    A首先进入synchronized代码块,由于instance此时为null,则执行instance = new Singleton()

    JVM会先分配给Singleton一些空白内存,并赋值给instance,不过此时JVM并没有开始初始化Singleton,然后A离开方法;

    B进入synchronized代码块,由于instance不为null,所以马上离开并把结果返回给调用者;

    至此,B线程要Singleton实例,却发现未被实例化,从而出错

public class Singleton{
  //私有静态实例,防止被引用,此处设置为null,是为了延迟加载
  private static Sigleton instance = null;
  
  //私有构造方法,防止被实例化
  private Singleton(){

  }
  
  //静态方法,创建实例
  public static Singleton getInstance(){
    if(instance == null){
      synchronized(instance){
        if(instance == null){
          instance = new Singleton();
        }
      }
    }
  }
  
  //若该类被用于序列化,可以保证序列号前后保持一致
  public Object readResolve(){
    return instace;
  }
}

 ==================================华丽丽的分割线====================================

单例模式3

    保证多线程环境,保证互斥.

    JVM能保证一个类被加载的时候,加载过程是互斥的,这样当第一次调用getInstance的时候

    JVM能够帮助我们保证instance只被创建一次,并且保证赋值给instace的结果已初始化完毕;

    同时该方法也只会在第一次调用的时候使用互斥机制,这样也解决低性能的问题;

public class Singleton{
  //私有构造方法,防止被实例化
  private Singleton(){

  }

  //使用一个内部类来维护单例
  private static class SingleFactory(){
    private static Sigleton instance = null;
  }
  
  //静态方法,创建实例
  public static Singleton getInstance(){
    return SingleFactory.instace;
  }
  
  //若该类被用于序列化,可以保证序列号前后保持一致
  public Object readResolve(){
    return instace;
  }
}

 

分享到:
评论

相关推荐

    几种单例模式demo

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制资源的唯一性、...在实际应用中,应根据项目需求来决定采用哪种单例模式。

    几种单例模式说明(并有实例)

    根据给定的信息,本文将详细解释几种常见的单例模式,并通过具体的Java代码示例来阐述每种模式的特点和实现方式。 ### 单例模式简介 单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局...

    7种单例模式

    在多线程环境下,我们需要确保单例实例的创建只发生一次,以上几种方式除了懒汉式(线程不安全)外,都能保证线程安全。对于反序列化测试,由于默认反序列化会生成新实例,需要重写 `readResolve()` 方法来防止这种...

    unity中涉及的三种单例模式

    下面将详细介绍在Unity中涉及的三种单例模式:C#经典单例、Unity内置单例以及一种线程安全的改进版单例。 1. C#经典单例: 这是最常见的单例实现方式,通常通过私有构造函数和一个静态方法来保证只有一个实例。在...

    设计模式之单例模式(结合工厂模式)

    此外,单例模式还有几种变体,比如静态内部类单例和枚举单例。静态内部类单例利用Java类加载机制保证了线程安全,而枚举单例则是Java中实现单例的最佳方式,因为它天然支持序列化且防止反射攻击。 在代码实现上,...

    单例模式代码实现

    这个讲的是单例模式的多种不同实现方式,希望对单例感兴趣的同学看看

    C#单例模式详解 C#单例模式详解C#单例模式详解

    首先,实现C#单例模式通常有几种常见方法: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了实例化,线程安全,但可能导致不必要的内存占用。 ```csharp public class Singleton { private static ...

    设计模式——单例模式

    为了解决懒汉式单例模式的性能问题,有几种优化策略: 1. **双检锁/双重校验锁(DCL,即 double-checked locking)** ```java public class Singleton { private volatile static Singleton instance; private ...

    Java设计模式之单例模式的七种写法

    在 Java 中,单例模式的写法有好几种,主要有懒汉式单例、饿汉式单例、登记式单例等。 懒汉式单例是一种常见的单例模式实现方式,它在第一次调用的时候实例化自己。下面是懒汉式单例的四种写法: 1、基本懒汉式...

    JAVA单例模式的几种实现方法

    ### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...

    Java 单例模式 工具类

    首先,让我们了解单例模式的几种常见实现方式: 1. 饿汉式(静态常量): 这是最简单的单例实现,它在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private static final ...

    设计模式之单例模式源码demo

    单例模式的实现方式有很多种,主要分为以下几种: 1. **饿汉单例模式**:在类加载时就完成初始化,因此静态变量`instance`会随着类的加载而被创建。这种方式线程安全,且因为单例在类加载时已经创建,所以不存在多...

    单例模式应用场景

    通过对上述应用场景的分析,我们可以总结出单例模式适用的几种情况: - **资源共享:** 当需要频繁访问某个资源(如日志文件、配置文件等)时,采用单例模式可以减少资源操作所带来的性能损耗。 - **控制资源:** ...

    单例模式,single

    针对上述问题,可以采取以下几种策略: 1. **线程安全的单例模式**:可以通过加锁或者使用内部类等方式来保证线程安全。例如,懒汉式单例模式中,可以在 `getInstance()` 方法上添加 `synchronized` 关键字,或者...

    单例模式各种实现方式

    以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private static final Singleton...

    java-单例模式几种写法

    单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供全局访问点。在Java中,实现单例模式有多种方法,每种方法都有其特点和适用场景。以下是对这六种常见单例模式实现方式的...

    单例模式的几种实现方式

    下面将详细介绍单例模式的几种常见实现方式。 1. 饿汉式(静态常量) 饿汉式单例在类加载时就完成了初始化,因此线程安全。这种方式简单且效率高,但如果单例对象不被使用,会造成内存浪费。 ```java public class...

    大话设计模式--Singleton(单例模式)

    单例模式的实现通常有以下几种方法: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了实例化,线程安全。代码如下: ```java public class Singleton { private static final Singleton INSTANCE = new ...

Global site tag (gtag.js) - Google Analytics