手写单例模式

embedded/2025/2/6 16:28:09/

饿汉式加载模式(线程安全)

类一加载就创建对象,这种方式比较常用

优点:线程安全,没有加锁,执行效率高

缺点:不是懒加载,类初始化的时候就加载,浪费内存空间

package com.example.threadpool.Singleton;public class Singleton1 {//私有化构造方法private Singleton1(){}//定义一个静态变量指向自己类型private final static Singleton1 instance=new Singleton1();//对外提供一个公共的方法获取实例public static Singleton1 getInstance() {return instance;}
}

懒汉式加载模式(线程不安全)

线程下使用没有问题,但是多线程无法保证单例

优点:懒加载

缺点:线程不安全

我们的Singleton instance对象是静态变量,我们多线程没有上锁的情况下,可能错误判断instance为null,然后生成多个instance

package com.example.threadpool.Singleton;/*** 懒汉式加载模式*/
public class Singleton2 {//私有化构造方法private Singleton2(){}//定义一个静态变量指向自己的类型private static Singleton2 instance;//对外提供一个公共方法来获取实例public static Singleton2 getInstance(){if(instance==null){instance =new Singleton2();}return instance;}}


懒汉式加载模式(线程安全)

synchronized关键字在初始化方法上,可以保证线程安全

优点:懒加载,线程安全

缺点:效率低,每一个调用getInstace获取实例的时候我们都需要加锁和释放锁

加锁了,就会保证多线程下创建的仍然是一个对象

package com.example.threadpool.Singleton;public class Singleton3 {//私有化构造方法private Singleton3(){}//定义一个静态变量指向自己的类型private static Singleton3 instance;//对外提供一个公共的方法获取实例public synchronized static Singleton3 getInstance(){if(instance==null){instance=new Singleton3();}return instance;}}

双重判定锁(线程安全)

我们多线程下会有个二次判断,这样子我们多线程下同时判断为null,但是我们锁住一个线程后有了这个初始化实例,我们第一个判断为null的线程再做一次判断,就可以拿到正确的初始化对象

双重判定锁的优先:

避免不必要的同步开销
单例模式中,传统实现会将整个 getInstance() 方法同步(即 synchronized),这样即使单例对象已经创建,仍然会有大量线程竞争锁,导致性能下降。
双重判定锁通过在进入同步块之前添加一次非同步的检查,可以避免每次调用都进行同步(也就是用了一次是否为null的初步判断,减少了我们调用同步方法的线程),只有在实例为 null 的情况下才进入同步

package com.example.threadpool.Singleton;/*** 双重判定锁*/
public class Singleton4 {//私有化一个构造方法private Singleton4(){}//定义一个静态变量指向自己private static Singleton4 instance;//对外提供一个公共方法来获取实例public static  Singleton4 getInstance(){if(instance==null){synchronized (Singleton4.class){if(instance==null) {instance = new Singleton4();}}}return instance;}}

http://www.ppmy.cn/embedded/160078.html

相关文章

【3】阿里面试题整理

[1]. ES架构,如何进行路由以及选主 路由:在Elasticsearch(ES)中,默认的路由算法是基于文档的_id。具体来说,Elasticsearch会对文档的_id进行哈希计算,然后对分片数量取模,以确定该文…

使用 MMCM 的 I/O 时序 ZHOLD/BUF_IN 补偿

使用 MMCM 的 I/O 时序 ZHOLD/BUF_IN 补偿 ZHOLD 补偿表示 MMCM 设置,为整个 I/O 列的所有 I/O 寄存器提供负保持。当具有时钟功能的 I/O (CCIO) 驱动设置 为 ZHOLD 补偿模式的单个 MMCM 时,布局器尝试将具有 CCIO 的 MMCM 布局在同一时钟…

开源 CSS 框架 Tailwind CSS

开源 CSS 框架 Tailwind CSS v4.0 分享 Tailwind CSS 是一个功能强大的开源 CSS 框架,于 2024 年 11 月发布了 v4.0 版本。这个版本带来了许多令人瞩目的新特性和改进,以下为你详细介绍: 新特性与改进 RTL(从右到左&#xff09…

MySQL表的增删改查(进阶)

1.数据库的约束 所谓的数据库约束就是,对于数据库的数据是有一定要求的。因为有些数据是合法数据,有些是非法数据。所以数据库约束就是自动得对数据的合法性进行校验检查得一系列机制,目的就是为了保证数据库中能够避免插入/修改一些非法得的…

java 日常下拉框接口字典封装

Operation(description "字典") GetMapping("/dict") public Result dict() {Long userItemId super.getUserItemId();Page<Manure> objectPage new Page<>();objectPage.setSize(100000);objectPage.setCurrent(1);Page<Manure> pag…

vue3的路由配置

先找到Layout布局文件&#xff0c;从中找到左侧边栏&#xff0c;找到下述代码 <SidebarItem v-for"route in noHiddenRoutes" :key"route.path" :item"route" :base-path"route.path" />/** *菜单项 <SidebarItem>: *使用…

机器学习 - 容易混淆的目标函数和损失函数

一、机器学习中的目标函数和损失函数之间的关系&#xff0c;看起来像是一个基础概念的问题&#xff0c;但需要仔细思考清楚两者的区别和联系。 目标函数和损失函数这两个术语在机器学习中经常被提到&#xff0c;有时候会被混用&#xff0c;但其实它们有不同的含义。目标函数通…

SpringUI Web高端动态交互元件库

Axure Web高端动态交互元件库是一个专为Web设计与开发领域设计的高质量资源集合&#xff0c;旨在加速原型设计和开发流程。以下是关于这个元件库的详细介绍&#xff1a; 一、概述 Axure Web高端动态交互元件库是一个集成了多种预制、高质量交互组件的工具集合。这些组件经过精…