JUC常见类

White graces:个人主页

🙉专栏推荐:Java入门知识🙉

🙉 内容推荐:Java锁的策略🙉

🐹今日诗词:苟利国家生死以,岂因祸福避趋之🐹


⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏

⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏


目录

Callable接口

ReentrantLock

ReentrantLock和synchronized的区别

信号量

二元信号量

CountDownLatch

线程安全的集合类

多线程使用ArrayList

CopyOnWriteArrayList(重点)

多线程使用队列

多线程使用哈希表(重点)

        美图分享


JUC是java.util.concurrent包的缩写, 这个包里面存放着多线程相关的类

Callable接口

和Runnable类似, 实现Callable接口, 可以创建一个线程任务, 配合Thread类可以把这个任务放到线程中运行

Callable和Runnable的区别: Runnable没有返回值, Callable有返回值

Callable的优势: 代码耦合性比Runnable更低(所以以后就用Callable吧,装逼且优雅)

ReentrantLock

ReentrantLock叫做: 可重入互斥锁

特点: 将加锁操作和解锁操作分开了

知道了ReentrantLock的特点了, 我们来看看他和Synchronized的区别吧

ReentrantLock和synchronized的区别

1. ReentrantLock提供了公平锁的实现

   synchronized只是一个非公平锁

2. ReentrantLock提供了trylock方法, 给加锁操作提供了更多的可能性

trylock作用: 如果线程没有获取到锁, 不会阻塞等待, 而是返回失败

而synchronizd是没有获取到锁就会死等(专一)

trylock还有带有超时时间的版本, 这段时间内没有获取到锁就会返回失败

3. synchronized搭配wait(等待), notify(通知)机制

而ReentrantLock通过Condition类来实现等待通知机制, 且功能比wait, notify更强

wait, notify是随机唤醒一个线程, 而Condition可以唤醒指定线程

信号量

Semaphore: 信号量

概念: 信号量就是一个计数器, 用于描述可用资源的个数

举例: 教室里空闲座位的个数, 这个个数就是信号量

围绕信号量有两个操作: P操作和V操作

P操作是申请资源, V操作是释放资源

PV是荷兰语的简写, 这个东西是一个荷兰人发明

P操作对应acquire()方法

V操作对应release()方法

二元信号量

如果可用资源数为1, 此时的信号量相当于一把锁

CountDownLatch

作用: 同时等待N个线程结束

与join()方法的区别: join是等待一个线程执行完毕并继续执行,CountDownLatch是同时等待N个线程执行完毕后才会继续执行下一步

线程安全的集合类

我们学过的大部分集合类都是不安全的

不安全的集合类: ArrayList, Queue , LinkedList, HashMap(HashTable对哈希表加了锁)...

带锁的集合类: Vector(自带synchronized), Stack(继承自Vector), HashTable...

加锁的集合类大部分情况下是线程安全的, 同时标准库也提供了方法, 用于加锁线程不安全的类或者接口, 我们来看看吧!

多线程使用ArrayList

 ArrayList使用Collection.synchronizedList()对List类型和子类的对象进行加锁

CopyOnWriteArrayList(重点)

多线程中还有一种方法解决ArrayList不安全的做法,使用CopyOnWriteArrayList

很多场景经常用到, 电影画面渲染, 电影是一帧一帧的, 画面并不是在原有的基础上修改

而是播放的时候用额外的空间生成下一幅图片,然后将引用指向当前播放的图片的引用,实现了画面切换, 直接修改画面会有撕裂感

多线程使用队列

这个直接使用阻塞队列即可(BlockingQueue)

多线程使用哈希表(重点)

HashMap是不安全的

HashTable在HashMap的基础上加了synchronized, 虽然是安全的,但是不推荐使用,因为有个更牛逼的东西

ConcurrentHashMap: HasTable是一个全局锁(一把锁), 我们知道哈希表是数组加链表的结构

1. ConcurrentHashMap使用锁桶(一堆锁)的方式加锁, 对每个链表进行加锁, 多把锁有效降低了锁冲突的概率

2. 普通哈希表涉及到多线程修改同一个变量会出现问题,这时候就要解锁解决, 但是ConcurrentHashMap引入了CAS来避免加锁操作了

3. ConcurrentHashMap还对扩容进行了优化, 普通哈希表到达哈希冲突的阈值后会扩容

将所有元素重新put到表中, 要put很多次,把数据一下搬完 导致这一时会比较慢

但是ConcurrentHashMap扩容会使用两份空间一份之前的,一份扩容后的, 接下来对哈希表进行操作时, 它会在后面将一部分数据搬运到新的空间, 每次搬一点, 而不是一下搬完

举个例子: 像学习一样, 每天学一点,时间长了就成大牛, 而不是期末突击一下

美图分享

✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄

⭐️点赞收藏加关注,学习知识不迷路⭐️

🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️

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

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

相关文章

Windows系统WDS+MDT网络启动自动化安装

Windows系统WDS+MDT网络启动自动化安装 适用于在Windows系统上WDS+MDT网络启动自动化安装 1. 安装准备 1.下载windows server 2019、windows 10 pro的ISO文件,并安装好windows server 2019 2.下载windows 10 2004版ADK及镜像包 1.1 安装平台 Windows 111.2. 软件信息 软件…

模型优化——模型剪枝、模型量化、知识蒸馏

1.模型剪枝 1.1什么是模型剪枝? 深度学习网络模型从卷积层到全连接层存在着大量冗余的参数,大量神经元激活值趋近于0,将这些神经元去除后可以表现出同样的模型表达能力,这种情况被称为过参数化,而对应的技术则被称为模…

摸鱼大数据——select查询7-10

7、union联合查询 union: 对重复数据会去重 union all: 对重复数据不会去重 ​ 注意:union和union all中两边的字段(类型、顺序)要对应上 示例: use day08; select * from students; ​ select id,name from students where id in (95001,9…

Python中的 Lambda 函数

大家好,在 Python 编程的世界里,有一种功能强大却不常被提及的工具,它就是 Lambda 函数。这种匿名函数在 Python 中拥有着令人惊叹的灵活性和简洁性,却常常被许多开发者忽视或者只是将其当作一种附加功能。Lambda 函数的引入&…

Java18+ springboot+mysql +Thymeleaf 技术架构开发的全套同城服务家政上门系统源码(APP用户端+APP服务端+PC管理端)

Java springbootmysql Thymeleaf 技术架构开发的全套同城服务家政上门系统源码(APP用户端APP服务端PC管理端) 家政上门预约系统:该系统综合运用springboot、java1.8、vue移动支付、微信授权登录等技术,由用户小程序、站长小程序、…

亚马逊云科技峰会盛大举行 | 光环新网携光环云数据以高性能智算服务助力企业创新发展

2024年5月29日,云计算行业的年度盛典”2024亚马逊云科技中国峰会”在上海世博中心再次盛大启幕。作为全球领先的云计算服务提供商,亚马逊云科技峰会聚焦前沿科技,与来自不同行业、不同科技领域的优秀企业和用户共同探索AI时代的云端创新发展。…

华为官网的自助申诉

代码&#xff1a;如下 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document</title> …

Facebook会话过期是什么情况?如何解决?

如果你点开这篇文章&#xff0c;可能你曾经遇到过Facebook会话过期的错误。无论你是在抓取Facebook数据还是只是浏览动态&#xff0c;看到这个错误消息都会让人很不爽。但别担心&#xff0c;我们将会分享解决Facebook会话过期错误的最佳方法&#xff0c;这样你就可以迅速修复问…

TemuTHunt使用简单介绍

数据列表 详情 列表及详情 数据监控 ------------------------------------------------华丽的分割线------------------------------------ 数据列表 商品详情 更多功能及分析报表 是不是很好用。

算法学习笔记(7.3)-贪心算法(最大切分乘问题)

目录 ##问题描述 ##问题思考 ##贪心策略确定 ##代码实现 ##时间复杂度 ##正确性验证 ##问题描述 给定一个正整数 &#x1d45b; &#xff0c;将其切分为至少两个正整数的和&#xff0c;求切分后所有整数的乘积最大是多少 ##问题思考 假设我们将 &#x1d45b; 切分为 &…

linux开发之设备树六、linux下pinctrl子系统管理设置pin管脚的复用功能(一般原厂提供)

客户端的编写格式是固定的&#xff0c;不管哪家原厂的处理器&#xff0c;格式都是一样的 对于服务端部分是原厂提供&#xff0c;各个芯片肯定就不一样了&#xff0c;主要在于编写的格式不同 pinctrl客户端写法 使用pinctrl设置管脚复用 在kernel/arch/arm64/boot/dts/rockchi…

清风雅致·林曦老师的中国画美育直播课 你想了解的都在这里

大家期待已久的《清风雅致林曦老师的中国画美育直播课》开启报名啦~这个夏天&#xff0c;林曦老师将带你画完十幅重要的册页图&#xff0c;明代杜琼的《南村别墅图》。在此期间&#xff0c;暄桐教室除了收到了大家的“心心念念”和“满怀期待”&#xff0c;还有一连串“小问号”…

将 cuda kernel 编译成 ptx 和 rocm的hip asm

1&#xff0c;cuda 源码编译 cuda_a_one.cu __global__ void NNNNNVVVVV_one(int *A) {A[333] 777; }编译命令&#xff1a; %.ptx: %.cu nvcc -archsm_70 -ptx $< -o $ 生成的结果&#xff1a; 2, hip 源码编译 hip_a_one.hip__global__ void AAAAAMMMMM_one(int *A…

Redis之持久化、集群

1. Redis持久化 Redis为什么需要持久化?因为Redis的数据我们都知道是存放在内存中的&#xff0c;那么每次关闭或者机器断电&#xff0c;我们的数据旧丢失了。 因此&#xff0c;Redis如果想要被别人使用&#xff0c;这个问题就需要解决&#xff0c;怎么解决呢?就是说我们的数…

安全风险 - 检测设备是否为模拟器

在很多安全机构的检测中&#xff0c;关于模拟器的运行环境一般也会做监听处理&#xff0c;有的可能允许执行但是会提示用户&#xff0c;有的可能直接禁止在模拟器上运行我方APP 如何判断当前 app 是运行在Android真机&#xff0c;还是运行在模拟器? 可能做 Framework 的朋友思…

广告联盟如何实现

在互联网时代&#xff0c;各种广告形式无处不在&#xff0c;无论是在社交媒体、网站还是APP上&#xff0c;广告无处不在。然而&#xff0c;广告对于一些人来说并不只是一种干扰&#xff0c;还可以是一种赚钱方式。下载广告联盟看广告能赚钱吗?这是一个很有趣的问题&#xff0c…

玩机进阶教程------修改gpt.bin分区表地址段 完全屏蔽系统更新 fast刷写分区表 操作步骤解析【二】

上期博文简单说明了分区表的基本常识。我们在有些环境中需要屏蔽手机的系统更新选项。除了以前博文中说明的修改系统更新下载文件夹的方法。还可以通过修改分区表类达到目的。在一些辅助维修工具上面带修改分区表功能。修改后效果为屏蔽系统更新和可以恢复出厂。原则上不深刷都…

短剧源码系统深层次解析:技术架构与实现

短剧源码系统作为短视频内容生产与分发的核心技术&#xff0c;其技术实现对于开发者和运营者至关重要。本文将深入探讨短剧源码系统的关键技术架构&#xff0c;特别是前端框架uni-app和Vue&#xff0c;以及后端框架ThinkPHP5和Workerman的应用。 前端框架&#xff1a;uni-app与…

怎么把图片大小调小?在线改图片大小的方法

怎么把比较大的图片压缩变小呢&#xff1f;在使用图片的时候&#xff0c;比较常见的一个问题就是图片太大导致无法正常上传&#xff0c;需要将图片处理到合适的大小之后&#xff0c;才可以正常在网上上传。现在一般调整图片大小多会通过使用在线改图片大小的在线工具来处理&…

SpringBoot集成JOOQ加Mybatis-plus使用@Slf4j日志

遇到个问题记录下&#xff0c;就是SpringBoot使用Mybatis和Mybatis-plus时可以正常打印日志&#xff0c;但是JOOQ的操作日志确打印不出来&#xff1f; 下面的解决方法就是将JOOQ的日志单独配置出来&#xff0c;直接给你们配置吧&#xff01; 在项目的resources目录下创建日志…