Java 单例模式详细解释

Java 单例模式详细解释

单例模式是一种设计模式,它限制一个类只能被实例化一次,并提供一个全局的访问点来获取这个实例。在Java中,单例模式被广泛应用,常见的例子包括线程池、日志系统等。下面我将详细讲解Java单例模式的实现方法和注意事项。

实现方法

饿汉式

饿汉式单例模式是一种线程安全(因为在类加载的时候就已经创建了实例)的实现方式。在这种实现方式中,类在初始化的时候就创建了自己的实例,并通过getInstance()方法提供给外界使用。下面是这种实现方式的示例代码:

public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

懒汉式

懒汉式单例模式是一种延迟创建实例的实现方式,只有在第一次调用getInstance()方法时才会创建实例。这种方式需要考虑线程安全问题,最简单的实现方法是在getInstance()方法上加上synchronized关键字。下面是这种实现方式的示例代码:

public class Singleton {
    private static Singleton instance = null;
    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

上面这种方法虽然线程安全,但是因为每次getInstance()方法都要获取锁,性能较差。下面是一种改进的方法,在getInstance()方法内部双重检查实例是否为null,只有在第一次调用getInstance()方法时才获取锁创建实例:

public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

注意这里需要使用volatile关键字来防止指令重排造成的线程安全问题。

注意事项

实现单例模式时需要考虑以下几个注意事项:

  1. 私有构造函数:单例类的构造函数需要是private,这样可以确保外部无法实例化该类。

  2. 静态getInstance()方法:单例类需要提供一个静态方法getInstance()来获取单例对象。

  3. 线程安全:如果使用懒汉式实现方式,需要考虑线程安全问题,可以使用synchronized关键字或者双重检查锁来解决。

  4. 序列化和反序列化:如果单例类需要支持序列化和反序列化,需要为单例类加上readResolve()方法,这样可以防止反序列化时创建新的实例。

示例说明

下面是一个使用单例模式实现线程池的示例:

public class ThreadPool {
    private static volatile ThreadPool instance = null;
    private ExecutorService executor;

    private ThreadPool() {
        executor = Executors.newFixedThreadPool(10);
    }

    public static ThreadPool getInstance() {
        if (instance == null) {
            synchronized (ThreadPool.class) {
                if (instance == null) {
                    instance = new ThreadPool();
                }
            }
        }
        return instance;
    }

    public void execute(Runnable task) {
        executor.execute(task);
    }
}

上面代码中的ThreadPool类使用了双重检查锁实现了单例模式,并提供了execute()方法来提交任务,这里使用了Java自带的线程池框架实现了任务的执行。

另一个示例是实现一个日志系统,这里的示例代码使用了饿汉式单例模式:

public class Logger {
    private static final Logger instance = new Logger();

    private Logger() {
        // 初始化日志系统
    }

    public static Logger getInstance() {
        return instance;
    }

    public void log(String message) {
        // 输出日志信息到文件或控制台
    }
}

上面代码中的Logger类使用了饿汉式单例模式,它在初始化的时候初始化了日志系统并提供了log()方法来输出日志信息。由于日志系统需要全局共享,所以使用单例模式是很合适的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 单例模式详细解释 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C++基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同)

    下面是 C++ 基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同)的详细攻略: 问题分析 题目要求我们判断两个二叉树的结构和数据是否完全相同。这里所说的“结构相同”指的是两棵树的节点数、节点的左右子树结构相同,而“数据相同”指的是两棵树的节点存储的数据值相等。 递归算法实现 递归是二叉树算法中最经典的算法之一,而判断两个二叉树结构是否相同…

    other 2023年6月27日
    00
  • thusc2015

    THUSC2015: 迎接未来的编程教育 编程教育是当前全球热门话题之一。很多国家和地区都开始将编程纳入了基础教育课程,或是通过各种方式提供编程学习机会,以培养下一代的IT人才。而在中国,由清华大学组织的THUSC2015编程营,自2015年开始,一直致力于为青少年提供优质的编程教育体验。 强大的师资力量 THUSC2015拥有一支由清华大学Turing计算…

    其他 2023年3月28日
    00
  • Android中常用单位dp,px,sp之间的相互转换

    Android中常用单位dp,px,sp之间的相互转换 前言 在Android开发中,我们常常需要使用到尺寸单位,如dp,px和sp。本文将介绍这些常用单位之间的相互转换,并提供相关的代码示例。 dp与px之间的转换 dp(density independent pixels)与px(pixels)之间的转换是Android开发中经常使用的操作。dp是设备独…

    其他 2023年3月28日
    00
  • yii2实现Ueditor百度编辑器的示例代码

    实现 Ueditor 百度编辑器,可以使用 Yii2 提供的一个扩展包 yii2-ueditor。下面将介绍使用该扩展包的详细攻略。 安装 yii2-ueditor 扩展包 使用 Composer 安装 yii2-ueditor 扩展包: composer require uiiitc/yii2-ueditor 修改配置文件(一般位于 config/web.…

    other 2023年6月27日
    00
  • delphi“div”、“mod”、“”除法运算符的区别与使用方法

    Delphi是一种面向对象的编程语言,常用于Windows平台的应用程序开发。在Delphi中,有三种不同的除法运算符:div、mod和/。本文将介绍这三种运算符的区别和使用方法。下面是“Delphi“div”、“mod”、“/”除法运算符的区别与使用方法”的完整攻略,包括两个示例说明。 div运算符 div运算符用于执行整数除法运算,返回两个整数相除的商。…

    other 2023年5月9日
    00
  • 去掉鼠标右键菜单里面的”用阿里旺旺发送此文件…”

    下面就是去掉鼠标右键菜单里面的”用阿里旺旺发送此文件…” 的完整攻略: 第一步:打开注册表 在 Windows 操作系统中,右键菜单是通过注册表控制的。因此,我们第一步需要打开注册表,具体步骤如下: 按下 “Win + R” 组合键打开 “运行” 窗口; 输入 “regedit” 并按下 “Enter” 键打开注册表编辑器。 第二步:定位到相关的注册表键…

    other 2023年6月27日
    00
  • MySQL中大数据表增加字段的实现思路

    MySQL中大数据表增加字段的实现思路主要包括以下几步: 1.备份数据:在进行任何数据库操作之前,必须先备份数据库,以避免意外情况造成数据丢失。 2.创建新字段:使用ALTER TABLE语句添加新的字段。具体语法如下: ALTER TABLE table_name ADD COLUMN column_name datatype; 其中,table_name…

    other 2023年6月25日
    00
  • Centos7 [ubuntu] 安装pycharm2019.1.3并永久破解教程

    Centos7 [ubuntu] 安装PyCharm 2019.1.3并永久破解教程 1. 确认系统版本 在开始安装PyCharm之前,请确保你的CentOS7或Ubuntu系统已经安装了Java SDK,并且已经进行了基本的系统更新。输入以下命令检查Java SDK是否安装成功: java -version 如果Java SDK已经安装,命令行会输出Jav…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部