`

几种单例创建的方式

阅读更多

(1) 直接加载,无论是否需要,只要类被虚拟机加载,这个单例就存在

 private static DirectSingleton directSingleton = new DirectSingleton();

    public static DirectSingleton getInstance() {
        return directSingleton;
    }
}

 这种方法的缺点是无法实现延迟加载,如果单例的创建过程很慢,而这个类除了创建单例以外还做了别的事情的话,可能导致所有用到这个单例类的地方都在创建单例而不管这个单例对象是否被用到。

(2)一种实现延迟加载的方式是在使用的时候创建单例对象,但是需要确保单例对象只被创建一次,因而需要使用synchronized关键字

public class LazySingletonUseSynchronize {
    private LazySingletonUseSynchronize(){
        System.out.println("LazySingletonUseSynchronize");
    }

    private static LazySingletonUseSynchronize lazySingleton = null;

    public static synchronized LazySingletonUseSynchronize getInstance(){
        if(lazySingleton == null){
            lazySingleton = new LazySingletonUseSynchronize();
        }
        return lazySingleton;
    }

}

 

 不给单例对象初始值,以确保系统没有额外的负担。虽然实现了延迟加载但是synchronized关键词的使用使得在多线程环境下,这种方式的耗时大大增加

 

(3)为了使用延迟加载,但是又不想使用同步可改进为通过内部类加载的方式去初始化单实例对象。当类被加载时内部类不会被初始化。这样既不会在主类加载的时候初始化单例对象,也不需要使用同步关键词确保实例只创建一个,因为只要jvm加载内部类,里面的static变量就会被初始化。

public class LazySingletonUserInnerClass {

    private LazySingletonUserInnerClass(){
        System.out.println("LazySingletonUserInnerClass");
    }

    private static class LazySingletonInnerClass{
        private static LazySingletonUserInnerClass lazySingleton = new LazySingletonUserInnerClass();
    }

    public static LazySingletonUserInnerClass getInstance(){
        return LazySingletonInnerClass.lazySingleton;
    }

    public static void main(String[] args) {
        LazySingletonUserInnerClass ss = getInstance();
        LazySingletonUserInnerClass ss1 = getInstance();
    }
}

 

 

分享到:
评论

相关推荐

    几种单例模式demo

    单例模式的实现方式有很多种,下面我们将详细探讨几种常见的单例模式的实现方法: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private ...

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

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

    unity中涉及的三种单例模式

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

    几种单例模式

    接下来,我们将深入探讨几种常见的单例模式实现方式。 ### 1. 饿汉式(静态常量) ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} ...

    7种单例模式

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

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

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

    单例模式的几种实现方式

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

    Java 单例模式 工具类

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

    单例模式的几种实现方式demo

    下面我们将深入探讨单例模式的几种实现方式。 ### 1. 饿汉式(静态常量) 饿汉式单例在类加载时就完成了初始化,因此是线程安全的。代码如下: ```java public class Singleton { private static final ...

    单例模式各种实现方式

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

    游戏角色创建程序(单例模式)

    假设我们的压缩包文件"CharacterCreate"包含的代码是实现单例模式的角色创建程序,那么可能包含以下几个关键部分: 1. 角色类(Character):定义角色的基本属性和行为。 2. 单例类(CharacterSingleton):持有...

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

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

    java-单例模式几种写法

    以下是对这六种常见单例模式实现方式的详细解释: 1. **饿汉式(静态常量)** 这是最简单的单例实现,它在类加载时就创建了实例,线程安全。 ```java public class Singleton { private static final Singleton...

    singleton.zip单例的几种实现demo,

    在"singleton.zip"压缩包中,我们可能会找到几种不同的Java单例实现方式的示例代码,包括饿汉式、懒汉式、反射实现以及内部类实现等。以下是对这些单例模式实现方式的详细解释: 1. **饿汉式(Eager Initialization...

    C++ 单例模式的几种实现方式研究

    "C++ 单例模式的几种实现方式研究" 单例模式是设计模式中最常应用的一种模式,也是面试官最喜欢的题目。但是,如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况。 单例模式的主要...

    Python中的单例模式的几种实现方式的及优化

    本篇文章将深入探讨Python中实现单例模式的几种方式以及它们的优缺点和优化策略。 首先,Python的模块机制实际上天然地支持单例模式。当模块首次被导入时,解释器会执行模块中的所有代码,生成相应的`.pyc`文件。...

    OC单例模式讲解

    为了解决这个问题,可以采用以下几种方法: 1. **双重检查锁定(Double-checked locking)**:这是一种常用的解决线程安全问题的方法,可以在不牺牲性能的情况下保证单例模式的线程安全。 2. **使用`@synchronized`...

    线程安全的单例模式的几种实现方法分享

    以下是对几种线程安全单例模式实现方式的详细解释: 1. **饿汉式单例**: 饿汉式单例在类加载时就完成了实例化,因此它是线程安全的。这种方式简单直接,但缺点是如果单例对象不需要立即使用,却已经创建,可能...

    Android单例模式

    为解决这一问题,有以下几种方案: 1. **在`getInstance`方法上加同步关键字**:简单但效率较低。 ```java public static synchronized Singleton getInstance() { if (single == null) { single = new ...

Global site tag (gtag.js) - Google Analytics