单例模式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; } }
相关推荐
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制资源的唯一性、...在实际应用中,应根据项目需求来决定采用哪种单例模式。
根据给定的信息,本文将详细解释几种常见的单例模式,并通过具体的Java代码示例来阐述每种模式的特点和实现方式。 ### 单例模式简介 单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局...
在多线程环境下,我们需要确保单例实例的创建只发生一次,以上几种方式除了懒汉式(线程不安全)外,都能保证线程安全。对于反序列化测试,由于默认反序列化会生成新实例,需要重写 `readResolve()` 方法来防止这种...
下面将详细介绍在Unity中涉及的三种单例模式:C#经典单例、Unity内置单例以及一种线程安全的改进版单例。 1. C#经典单例: 这是最常见的单例实现方式,通常通过私有构造函数和一个静态方法来保证只有一个实例。在...
此外,单例模式还有几种变体,比如静态内部类单例和枚举单例。静态内部类单例利用Java类加载机制保证了线程安全,而枚举单例则是Java中实现单例的最佳方式,因为它天然支持序列化且防止反射攻击。 在代码实现上,...
这个讲的是单例模式的多种不同实现方式,希望对单例感兴趣的同学看看
首先,实现C#单例模式通常有几种常见方法: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了实例化,线程安全,但可能导致不必要的内存占用。 ```csharp public class Singleton { private static ...
为了解决懒汉式单例模式的性能问题,有几种优化策略: 1. **双检锁/双重校验锁(DCL,即 double-checked locking)** ```java public class Singleton { private volatile static Singleton instance; private ...
在 Java 中,单例模式的写法有好几种,主要有懒汉式单例、饿汉式单例、登记式单例等。 懒汉式单例是一种常见的单例模式实现方式,它在第一次调用的时候实例化自己。下面是懒汉式单例的四种写法: 1、基本懒汉式...
### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...
首先,让我们了解单例模式的几种常见实现方式: 1. 饿汉式(静态常量): 这是最简单的单例实现,它在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private static final ...
单例模式的实现方式有很多种,主要分为以下几种: 1. **饿汉单例模式**:在类加载时就完成初始化,因此静态变量`instance`会随着类的加载而被创建。这种方式线程安全,且因为单例在类加载时已经创建,所以不存在多...
通过对上述应用场景的分析,我们可以总结出单例模式适用的几种情况: - **资源共享:** 当需要频繁访问某个资源(如日志文件、配置文件等)时,采用单例模式可以减少资源操作所带来的性能损耗。 - **控制资源:** ...
针对上述问题,可以采取以下几种策略: 1. **线程安全的单例模式**:可以通过加锁或者使用内部类等方式来保证线程安全。例如,懒汉式单例模式中,可以在 `getInstance()` 方法上添加 `synchronized` 关键字,或者...
以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private static final Singleton...
单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供全局访问点。在Java中,实现单例模式有多种方法,每种方法都有其特点和适用场景。以下是对这六种常见单例模式实现方式的...
下面将详细介绍单例模式的几种常见实现方式。 1. 饿汉式(静态常量) 饿汉式单例在类加载时就完成了初始化,因此线程安全。这种方式简单且效率高,但如果单例对象不被使用,会造成内存浪费。 ```java public class...
单例模式的实现通常有以下几种方法: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了实例化,线程安全。代码如下: ```java public class Singleton { private static final Singleton INSTANCE = new ...