【Java EE初阶 --- 多线程(进阶)】JUC

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言 ,Java

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

文章目录

  • JUC组件
    • ReentrantLock与synchronized的区别
    • Semaphore信号量
    • CountDownLatch
  • 线程安全的集合类
    • 多线程环境下使用ArrayList
    • 多线程环境下使用队列
    • 多线程使用Hash表
  • 完结

JUC组件

JUC( java.util.concurrent ) :是和多线程相关的工具。

Callable接口与之前的Runnable接口是并列关系,二者的主要区别在于对程序运行结果的获取
在这里插入图片描述

但是Thread的构造方法没有提供版本去传入Callable对象: Thread只是一个线程,它的重点在于完成任务,而不是获取到完成任务后的结果。
在这里插入图片描述
如果我们想要得到任务完成后的结果,需要有一个“中间人”帮助。
在这里插入图片描述
FutureTask就是这个中间人,它获取到任务的结果,在把它交给线程,由线程来获取FurtureTask对象,即拿到任务结果。

ReentrantLock与synchronized的区别

首先都是可重入锁

区别:
1. synchronized是关键字,通过JVM内部C++实现的;ReentrantLack是Java标准库的类
2. synchronized通过代码块控制加锁解锁;ReentrantLock需要lock/unlock方法
3. ReentrantLock还有tryLock()方法,判断加锁成功返回true,加锁失败返回false(不会阻塞)
4. ReentrantLock提供了公平锁的效果。(默认非公平)
5. ReentrantLock搭配的等待通知机制,是Condition类。相比较wait notify来说更加强大
在这里插入图片描述

Semaphore信号量

本质:协调多个进程(线程)之间的资源分配,可以理解为计数器:描述资源的个数
申请一个资源,计数器-1 — P操作
释放一个资源,计数器+1 — V操作

在这里插入图片描述
信号量初始值为1的情况,取值要么是1,要么是0:等价于锁

在这里插入图片描述

CountDownLatch

我们使用多线程的目的是为了提高重程序运行效率,通过把一个大任务分解为多个小人物来实现,使用多个线程来解决这些小任务,从而完成大任务。那么我们如何得知,这个大任务什么时候完成?

1. 构造方法指定一个参数,描述一个拆分了多少个任务
2. 每个任务执行完成后,都调用一次countDown方法
3. 主线程重调用await方法,等待所有任务执行完毕,await返回/阻塞等待

在这里插入图片描述

线程安全的集合类

多线程环境下使用ArrayList

  1. 自己加锁:具体情况,具体分析
  2. Collection.synchronizedList(new ArrayList)提前嵌套,返回的List的各种关键方法都是带有synchronized
  3. 使用CopyOnWriteArrayList(写时拷贝),不用锁

多线程环境下使用队列

1. ArrayBlockQueue:基于数组实现的阻塞队列
2. LinkedBlockingQueue:基于链表实现的阻塞队列
3. PriorityBlockingQueue:基于堆实现的带优先级的阻塞队列
4. TransferQueue:最多只含有一个元素的阻塞队列

多线程使用Hash表

HashMap线程不安全
Hashtable线程安全(给public方法都加了synchronized)

ConcurrentHashMap线程安全,效率更高
因为它是按照桶级别进行加锁,而不是给hash加一个全局锁,降低锁冲突概率
优化点:
1. 把锁整个hash表 优化 为锁桶
2. 使用原子类针对size进行维护
3. hash扩容时,化整为零

完结


可以点一个免费的赞并收藏起来~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散 ~ ~ ~

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

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

相关文章

免费静态网站搭建

免费静态网站搭建 内容简介搭建步骤GitHub仓库创建Jekyll安装使用Jekyll安装指南Jekyll快速搭建测试Jekyll后续玩法 内容简介 🚩Tech Contents:GithubPage/Jekyll/Custom URLs 🐱GitHub Pages:静态网站托管服务,自动将…

MySQL 8.0 OCP 1Z0-908 题目解析(21)

题目81 Choose two. Examine the modified output: mysql> SHOW SLAVE STATUS\G *************************** 1. row ***************************Slave_IO_Running: YesSlave_SQL_Running: YesSeconds_Behind_Master: 1612Seconds_Behind_Master value is steadily gro…

Web前端开发-HTML、CSS

文章目录是什么?HTML快速入门VS Code开发工具基础标签&样式新浪新闻-标题标题排版标题样式标题样式-1标题样式-2超链接新浪新闻-正文新浪新闻-正文排版新浪新闻-页面布局表格标签表单标签表单标签-表单项是什么? HTML快速入门 VS Code开发工具 基础标…

Vue.js状态管理: Vuex在大型项目中的实际应用

# Vue.js状态管理: Vuex在大型项目中的实际应用 ## 一、Vuex核心架构与大型项目适配 ### 1.1 状态管理(State Management)的本质需求 在复杂前端系统中,组件间的数据传递成本随项目规模呈指数级增长。根据Vue官方统计,超过500个组…

C++开发:结构体作为函数形参的值传递与引用传递

笔者定义了一个结构体变量,用于作为函数的形参,定义如下:struct CardParameters {float* Average nullptr;int averageSize 0; }; 需求描述:结构体变量作为函数的形参,在函数体中给指针变量分配内存空间并赋值&#…

【unity小技巧】在 Unity 中将 2D 精灵添加到 3D 游戏中,并实现阴影投射效果,实现类《八分旅人》《饥荒》等等的2.5D游戏效果

注意:考虑到unity小技巧的内容比较多,我将该内容分开,并全部整合放在【unity小技巧】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言实战1、在3D场景中,新建一些不同形状的2D图片2、我们新建一个Lit材质3…

Rust 内存结构:深入解析

Rust 的内存管理系统是其核心特性之一,结合了手动内存管理的效率与自动内存管理的安全性。以下是 Rust 内存结构的全面解析: 内存布局概览 ----------------------- | 代码段 (Text) | 只读,存储可执行指令 ----------------------…

【Chrome】‘Good助手‘ 扩展程序使用介绍

这是我开发的一款 Chrome 浏览器扩展程序,目前主要集成了‘AI对话‘,’总结页面’,‘基于页面问答’等功能,最近几天我也将写一篇介绍如何开发 chrome 扩展程序的博客,带你了解如何开发属于自己的插件。 注&#xff1…

基于mysql8.0.27部署1主2从的MHA集群

目录 一、mysql概述 1.1、关系型数据库 1.2、MySQL数据库 1.3、RDBMS术语 二、mysql的部署 2.1、拉取mysql 2.2、解压 2.3、 改名 2.4、 指定安装文件位置 2.5、 创建用户组 2.6、 修改mysql配置文件 2.7、创建data文件夹 2.8、更改mysql目录权限 2.9、初始化数据…

Highcharts 安装使用教程

一、Highcharts 简介 Highcharts 是一款使用 JavaScript 编写的前端数据可视化库,支持折线图、柱状图、饼图、面积图、散点图等多种图表类型,特点是渲染性能优秀、交互丰富、兼容性强,适合构建商业图表、统计报表等。 二、Highcharts 安装方…

Qt中的坐标系

Qt中的坐标系 1.坐标系概念2.数学坐标系VS计算机坐标系3.Qt坐标系4.像素 🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀🚀系列专栏:【Qt的学习】 📝📝本篇内容&am…

C++原子类型操作与内存序

C原子类型操作与内存序详解 这段内容深入介绍了C标准原子类型的操作接口、内存序语义及使用规范。以下是关键知识点的分层解析&#xff1a; 一、原子类型的命名规则与类型映射 C提供两种方式表示原子类型&#xff1a; 模板特化形式&#xff1a;std::atomic<T>别名形式…

互联网摸鱼日报(2025-07-07)

互联网摸鱼日报(2025-07-07) 钛媒体 一场突如其来的“召回潮”&#xff0c;点燃中国制造的“灵魂拷问” 史上最大外卖补贴战开打&#xff0c;美团聚拢资源迎战“巨无霸” 1315亿加冕潮汕女首富&#xff0c;“最强打工妹”剑指港股 用14346字&#xff0c;讲透上市前必做的10…

七牛云Java开发面试题及参考答案

详述 Java 方法重载的机制与应用场景 Java 方法重载&#xff08;Method Overloading&#xff09;是面向对象编程中的重要特性&#xff0c;它允许同一个类中存在多个同名但参数列表不同的方法。这种机制为代码提供了灵活性和可读性&#xff0c;使得开发者可以用统一的方法名处理…

.net core mvc部署到win10本地的Ubuntu上

将一个 .NET Core MVC 应用部署到 Windows 10 上通过 WSL 安装的 Ubuntu 环境中&#xff0c;可以分为几个步骤来完成。以下是详细的指南&#xff1a;准备工作确保你的Ubuntu环境已安装.NET SDK&#xff1a;首先&#xff0c;你需要在WSL中的Ubuntu上安装.NET SDK。可以通过以下命…

机器人VLA模型(Vision-Language-Action)

一、VLA模型的技术架构与核心原理 VLA&#xff08;Vision-Language-Action&#xff09;模型的核心是构建视觉、语言、动作的多模态闭环系统&#xff0c;实现从感知到执行的端到端映射。其技术架构可细分为四个关键模块&#xff1a; 1. 多模态编码器 视觉编码器&#xff1a; …

单点登录SSO的演进和最佳实践,含springBoot 实现(Java版本)

一、单点登录&#xff08;SSO&#xff09;概述 单点登录&#xff08;SSO, Single Sign-On&#xff09;是一种认证机制&#xff0c;允许用户只需登录一次&#xff0c;即可访问多个相互信任的系统或应用&#xff0c;而不需要为每个系统重复登录。 二、SSO 演进路径 我们可以从以…

Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)

一、 高通滤波 高通滤波是对图像进行卷积操作&#xff0c;以保留图像中的快速变化部分&#xff08;如边缘和细节&#xff09;&#xff0c;同时抑 制低频分量&#xff08;如大面积平坦区域&#xff09;。 应用场景 边缘检测&#xff1a;提取物体轮廓和边界。特征提取&#xff…

oracle 恢复

RECOVER DATABASE USING BACKUP CONTROLFILE “用备份的控制文件推动数据库恢复”。-- 检查控制文件记录的当前SCN (V$DATABASE) SELECT CURRENT_SCN FROM V$DATABASE; -- 检查数据文件头SCN (V$DATAFILE_HEADER) SELECT FILE#, CHECKPOINT_CHANGE# FROM V$DATAFILE_HEADER;-…

京东商品详情SKU数据采集的难点有哪些?

京东商品详情 SKU 数据采集过程中&#xff0c;由于平台的技术防护、数据结构特性及合规性要求&#xff0c;会面临诸多难点&#xff0c;具体如下&#xff1a;一、反爬虫机制的限制京东作为大型电商平台&#xff0c;拥有成熟且严格的反爬虫系统&#xff0c;这是采集时最核心的障碍…