Java EE--多线程(二)

news2024/11/24 12:10:23

目录

四、多线程案例之--单例模式

3.1 单例模式

3.2 怎么去设计一个单例?

 饿汉模式

 懒汉模式

3.3 两种模式的总结

四、多线程案例之--单例模式

4.1 单例模式

是校招中最常考的设计模式之一.

啥是设计模式?

设计模式好比象棋中的 " 棋谱 ". 红方当头炮 , 黑方马来跳 . 针对红方的一些走法 , 黑方应招的时候有一些固定的套路. 按照套路来走局势就不会吃亏 .
软件开发中也有很多常见的 " 问题场景 ". 针对这些问题场景 , 大佬们总结出了一些固定的套路 . 按照这个套路来实现代码, 也不会吃亏 .

 单例模式能保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例.

这一点在很多场景上都需要. 比如 JDBC 中的 DataSource 实例就只需要一个.

(定义了数据库的用户名,密码,连接串,通过DataSource的实例对象获取数据库的连接)

单例模式具体的实现方式 , 分成 " 饿汉 " " 懒汉 " 两种 .

4.2 怎么去设计一个单例?

1.口头约定

对外提供一个方法,要求大家使用这个对象的时候,通过这个方法来获取

(不靠谱,不采用)

2.使用编程语言本身的特性来处理

首先要分析清楚,在Java中哪些对象是全局唯一的 

.class对象 比如String.class  类对象

 

 

 饿汉模式

既然是单例那么通过new的方式去获取对象是有歧义的 那么就不能让外部去new这个对象

Singleton singleton = new Singleton();
//构造方法私有化
private Singleton(){}
public static Singleton getInstance(){
 return instance;
}//用static修饰方法

private static Singleton instance = new Singleton();
//类似于这种类一加载就完成初始化的方式 称为饿汉模式
//书写简单不易出错

懒汉模式

避免程序启动的时候浪费过多的系统资源,当程序使用这个对象时再对它进行初始化

//定义一个类成员变量
private static SingletonLazy instance = null;
public static SingletonLazy getInstance(){
//在获取成员变量的时候判断是否已经初始创建
//如果没有则创建出来
if(instance == nul){
     instance = new SingletonLazy();
  }
return instance;
}

多线程环境下获取单例对象:

  // 创建多个线程,并获取单例对象
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(() -> {
                // 获取单例对象,并打印
                SingletonLazy instance = SingletonLazy.getInstance();
                System.out.println(instance);
            });
            // 启动线程
            thread.start();
        }
    }
}

                                                                                

 通过检查发现获取到了不同的对象,出现了线程不安全

分析造成线程不安全的原因:

 为了解决这个问题,可以把初始化代码加锁:

public synchronized static SingletonLazy getInstance(){

 可以看到依然出现了线程安全问题,那么就需要扩大锁的力度

 

输出正常、

但是还剩一个非常严重的问题!

 

 举个栗子:

 为了避免过度竞争消耗,加入一层判断

 public static SingletonDCL getInstance() {
        // 为了让后面的线程不再获取锁,避免了锁竞争造成的资源浪费
        if (instance == null) {
            synchronized (SingletonDCL.class) {
                // 完成初始化操作,只执行一次
                if (instance == null) {
                    instance = new SingletonDCL();
                }
            }
        }
        //双重检查锁

通过加synchnized关键字解决了原子性,内存可见性问题,那有序性如何保证?

那么就需要给共享变量加volatile关键字

public class SingletonDCL {
    // 定义一个类成员变量
    private volatile static SingletonDCL instance;

    // 构造方法私有化
    private SingletonDCL() {
    }

    public static SingletonDCL getInstance() {
        // 为了让后面的线程不再获取锁,避免了锁竞争造成的资源浪费
        if (instance == null) {
            synchronized (SingletonDCL.class) {
                // 完成初始化操作,只执行一次
                if (instance == null) {
                    instance = new SingletonDCL();
                }
            }
        }
        // 返回实例对象
        return instance;
    }
}

 4.3 两种模式的总结

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/508422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cookie的使用

1.Cookie的工作原理 Web应用程序中使用的是HTTP.HTTP是无状态协议,客户端与服务器完成业务交互后,它们之间的联系会关闭.由于交互式Web应用的需求增加,管理会话和识别用户的身份应运而生.比如,用户A登录一个网站后,在第二次登录的时候会免登录,自动进入用户A的个人主页. 服务…

哪种蓝牙耳机戴着最舒服?佩戴最舒服的真无线蓝牙耳机

无论在地铁、咖啡厅、商场甚至是机场&#xff0c;佩戴蓝牙耳机可以让我们尽情地享受音乐&#xff0c;戴上耳机可以避免影响他人的同时也能避免隐私的泄露。因此这几年真无线蓝牙耳机也受到了广大网友的追捧。&#xff0c;下面分享几款佩戴舒适的蓝牙耳机给大家。 一、南卡小音…

修改文章的软件-有没有自动修改文章的软件

自动修改文章神器 自动修改文章神器是一种利用人工智能和自然语言处理技术&#xff0c;帮助用户快速修改和优化文章的工具。该软件能够检测文章的语法和拼写错误、表达不当的问题&#xff0c;并自动提供修改和优化建议。用户只需根据软件的提示进行修改&#xff0c;就能得到高…

三子棋游戏的实现

前言&#xff1a;相信大家都玩过三子棋吧&#xff0c;曾想经常和同学在考试之后玩一个晚自习的三子棋。那么&#xff0c;如何自己编写一个三子棋游戏呢&#xff0c;请看下面的分析&#xff1b; 1.游戏设计思路 在写任何代码时&#xff0c;最好先有个大致的框架&#xff0c;然后…

二维数组---C语言(行列抽象思维)

目录 前言&#xff1a; 1.数组 1.1数组的初始化 1.2数组的访问方法 2.二维数组 2.1二维数组的创建和初始化 2.2二维数组的访问 2.3内存中的二维数组 ❤博主CSDN:啊苏要学习 ▶专栏分类&#xff1a;C语言◀ C语言的学习&#xff0c;是为我们今后学习其它语言打好基础&am…

探索 Elasticsearch 8.X Terms Set 检索的应用与原理

1、Terms Set 检索简介 Terms Set查询是Elasticsearch中一种强大的查询类型&#xff0c;主要用于处理多值字段中的文档匹配。 其核心功能在于&#xff0c;它可以检索至少匹配一定数量给定词项的文档&#xff0c;其中匹配的数量可以是固定值&#xff0c;也可以是基于另一个字段的…

快速排序、希尔排序、归并排序、堆排序、插入排序、冒泡排序、选择排序(递归、非递归)C语言详解

1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&…

postman 的 console 窗口,助力 http 请求错误时的问题排查

postman 是个很不错的 http 请求测试工具&#xff0c;有时我们使用它发送 http 请求&#xff0c;但是因为各种原因&#xff0c;导致请求失败&#xff0c;没有 response 返回&#xff0c;可能只有一个状态码&#xff0c;这让我们排查起来非常困难&#xff0c;比如下图所示&#…

GitLab + Jenkins 实现持续集成CI

1 软件版本 2 基础环境安装 2.1 docker 安装 yum install -y docker-ce-20.10.16 systemctl start docker && systemctl enable docker docker version 2.2 docker-compose 安装 curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-c…

虚拟化无法开启

虚拟化无法开启 开启虚拟机&#xff0c;突然出现以下报错&#xff1a; 此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态。 如果已在 BIOS/固件设置中禁用 Intel VT-x&#xff0c;或主机自更改此设置后从未重新启动&#xff0c;则 Intel VT-x 可能被禁用。 (1…

modbus 协议地址

modbus 仿真软件 modbus slave: 用作 modbus 服务器(也叫做modbus从站), 通常用于仿真PLC设备.modbus poll: 用作 modbus 客户端(也叫做modbus主站), 用于仿真上位机程序, 通常使用它在现场验证PLC设备的modbus通讯是否OK 理解 modbus 寻址 modbus 分4个数据区, 实际因为第4区可…

【Redis】Redis 高性能IO模型原理

前言 在面试的时候遇到Redis肯定会问&#xff0c;Redis单线程为什么那么快呀&#xff1f;你可以说下你对IO多路复用的机制嘛。但是仔细一想Redis真的是单线程在运行处理嘛&#xff0c;其实这个单线程主要指的Redis的网络IO和键值对读写是由一个线程来完成的&#xff0c;Redis在…

深度学习—卷积神经网络简单理论及实践

卷积神经网络 传统意义上的多层神经网络只有输入层、隐藏层和输出层。其中隐藏层的层数根据需要而定&#xff0c;没有明确的理论推导来说明到底多少层合适。 卷积神经网络CNN&#xff0c;在原来多层神经网络的基础上&#xff0c;加入了更加有效的特征学习部分&#xff0c;具…

Docker 安装 elasticsearch、kibana、ik

一、安装elasticsearch 1. 拉取 elasticsearch 镜像 docker pull elasticsearch:7.6.2 2. 创建 elasticsearch 容器 docker run --name elasticsearch7.6.2 -d -e ES_JAVA_OPTS"-Xms512m -Xmx512m" --net host -e "discovery.typesingle-node" -p 92…

SpringCloud踩坑系列:Mybatis的Mapper报错

500错误&#xff0c; 报错信息如下&#xff1a; org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): org.cyf.serviceDriverUser.mapper.DriverUserMapper.select1 at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(M…

判断两个时间段是否有交集

判断两个时间段是否有交集 前言&#xff1a;项目中遇到了类似会议室预约的时间段被占用&#xff0c;预约车辆时间段被占用等。 start&#xff1a;预约开始时间。 end&#xff1a;预约结束时间。 思考&#x1f914;&#xff1a; 那几种情况&#xff0c;可以正常预约&#x…

部署harbor私有镜像仓库

环境&#xff1a;所有机器都是centos7.4 一、部署harbor镜像仓库 机器IP&#xff1a;10.0.0.9 harbor服务器 1.下载harbor压缩包到服务器/root目录下[rootharbor~]#wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v2.5.3/harbor-offline-i…

【云计算•云原生】7.play with kubernetes在线实验环境

文章目录 1.play with kubernetes介绍2.搭建多节点nginx示例 1.play with kubernetes介绍 play with kubernetes网站链接 https://labs.play-with-k8s.com/每次登录提供4小时在线实验环境&#xff0c;最多可以开5个节点 2.搭建多节点nginx示例 点击左边的ADD NEW INSTANCE之…

网络路径下倾斜模型生产流程-倾斜生产

网络路径下倾斜模型生产流程-倾斜生产 全部控制点完成刺点后&#xff0c;检查无误后&#xff0c;点击Submit aerotriangulation。 选择使用控制点进行空三。 此时&#xff0c;将影像色彩平衡设置为Enabled&#xff0c;Position和Rotation设置为Compute。点击Submit开始空三。 …

知识管理工具,你选择语雀、Baklib、Notion还是FlowUs?

随着信息技术的不断发展&#xff0c;人们对于笔记软件的需求也越来越高。笔记软件可以帮助我们记录生活中的点滴&#xff0c;整理工作中的思路&#xff0c;提高工作效率和生活品质。然而&#xff0c;市面上的笔记软件种类繁多&#xff0c;选择一款适合自己使用的笔记软件也成为…