【多线程】多线程(11):ABA问题,JUC的常见类

【ABA问题】

线程改变了一个数值,但又修改回去了,看上去跟没变一样,但实际上已经有改过了的痕迹,可能引发一些bug

CAS中存在ABA问题,但大部分情况下它不会带来bug

【JUC的常见类】

JUC指的是java.util.concurrent这个包

【Callable接口】

Callable<Integer> callable = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i < 1000; i++) {sum += i;}return sum;}};FutureTask<Integer> futureTask = new FutureTask<>(callable);Thread t = new Thread(futureTask);t.start();System.out.println(futureTask.get());

解析:

1.创建一个匿名内部类,实现Callable接口,Callable接口内带有泛型参数,表示返回值的类型

2.重写Callable的call方法,完成累加过程,通过返回值返回计算结果

3.把callable实例用FutureTask包装一下

4.创建线程,线程构造方法内传入FutureTask,此时新线程会执行FutureTask内部Callable的call方法,完成计算,计算结果就放到了FutureTask

5.调用futureTask.get(),可以阻塞等待新线程计算完毕,并获取到FutureTask中的结果

总结:

Callable可以创建线程,并为线程封装了一个返回值,方便借助多线程的方式计算结果

【ReentrantLock(重点掌握)】

可重入锁,这是一种经典风格的锁,通过lock和unlock两种方法完成加锁

ReentrantLock locker = new ReentrantLock();Thread t1 = new Thread(() ->{for(int i = 0;i < 50000;i++){locker.lock();count++;locker.unlock();}});Thread t2 = new Thread(() ->{for(int i = 0;i < 50000;i++){locker.lock();count++;locker.unlock();}});t1.start();t2.start();t1.join();t2.join();System.out.println("count=" + count);

解析:

通过创建ReentrantLock对象的实例locker,并以实例调用lock()和unlock()来对count++进行加锁和解锁

传入参数:true,可以令ReentrantLock以公平锁的形式运行,不传入参数则以非公平锁的形式体现

【ReentrantLock和synchronized的区别】

1.synchronized是关键字(底层通过JVM的c++代码实现),ReentrantLock是标准库提供的类,通过java代码实现

2.synchronized通过代码块控制加锁解锁,ReentrantLock通过调用lock和unlock方法来完成,unlock可能会遗漏(可以把unlock放到finally中)

3.ReentrantLock提供了tryLock这样的加锁风格

前面的锁都是发现锁被别人占用了,就阻塞等待,直到加上锁为止

而tryLock在加锁失败时,不会阻塞,而是直接返回,通过返回值来反馈加锁成功/失败

4.ReentrantLock提供了公平锁的实现,默认是非公平的,但在参数中可以调整成公平的

5.ReentrantLock提供了功能更强的“等待通知”,基于Condition类来实现

【信号量Semaphore(重点掌握)】

//        ReentrantLock locker = new ReentrantLock(true);Semaphore semaphore = new Semaphore(1);Thread t1 = new Thread(() ->{for(int i = 0;i < 50000;i++){
//                locker.lock();try {semaphore.acquire();count++;semaphore.release();} catch (InterruptedException e) {throw new RuntimeException(e);}
//                locker.unlock();}});Thread t2 = new Thread(() ->{for(int i = 0;i < 50000;i++){
//                locker.lock();try {semaphore.acquire();count++;semaphore.release();} catch (InterruptedException e) {throw new RuntimeException(e);}
//                locker.unlock();}});

解析:

通过调用acquire()(P操作)来申请资源,调用release()(V操作)来释放资源,达成类似于锁的效果

值为1的信号量相当于锁

信号量的值一般是0或者1,所以也有「二元信号量」的称呼

【CountDownLatch】

同时等待n个线程结束

可以衡量当前任务是否整体执行结束

把一个大任务拆成多个小任务时,借助这个组件衡量何时所有的小任务都执行完毕

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

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

相关文章

程序的开发流程

我们在进行功能开发时&#xff0c;都是根据如下流程进行&#xff1a; 查看页面原型明确需求 根据页面原型和需求&#xff0c;进行表结构设计、编写接口文档(已提供) 阅读接口文档 思路分析 功能接口开发 就是开发后台的业务功能&#xff0c;一个业务功能&#xff0c;我们称为…

10月11日星期五今日早报简报微语报早读

10月11日星期五&#xff0c;农历九月初九&#xff0c;早报#微语早读。 1、外交部&#xff1a;对美国3家军工企业及10名高管采取反制措施&#xff1b; 2、宁夏“铁拳”行动典型案例&#xff1a;一加油站擅自更换主板被罚150万&#xff1b; 3、国家统计局&#xff1a;决定在全…

推荐一个物联网平台,支持源代码交付

ThingsKit物联网平台概述&#xff1a; ThingsKit是一个开箱即用的物联网平台&#xff0c;它支持通过行业标准的物联网协议&#xff08;如MQTT、TCP、UDP、CoAP和HTTP&#xff09;实现设备连接。这个平台能够帮助用户快速实现物联网的数据收集、分析处理、可视化和设备管理&…

揭秘胆囊结石的中医智慧:传统疗法如何化解“石”难

在现代医学快速发展的今天&#xff0c;中医作为一门历史悠久的医学体系&#xff0c;依然在治疗多种疾病中展现出独特的魅力。胆囊结石&#xff0c;这一困扰着无数人的健康问题&#xff0c;正是中医治疗的亮点之一。本文将带您走进中医的世界&#xff0c;探索胆囊结石的中医治疗…

GEE 错误:Can‘t transform (11121.0,18905.0),Can‘t transform (-1.0,-1.0)

目录 错误 原始代码链接 原始代码 解决方案 函数 SampleRegions(collection, properties, scale, projection, tileScale, geometries) Arguments: Returns: FeatureCollection 修改后的代码 结果 错误 我正在尝试从乌干达 888 户家庭的 VNP21A1 每日温度数据集中提…

第 2 章 基础支持层(下)

2.6 DataSource MyBatis 提供了两个 javax.sql.DataSource 接口实现&#xff0c;分别是 PooledDataSource 和 UnpooledDataSource。MyBatis 使用不同的 DataSourceFactory 接口实现创建不同类型的 DataSource。 2.6.1 工厂方法模式 在工厂方法模式中&#xff0c;定义一个用于…

ssm题库管理系统的设计与实现

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 摘 要 I Abstract II 1 绪论 1 1.1课题研究背景和来源 1 1.2课题研究现状 1 1.3课题开发的目的和意…

大贤3D家谱-关于节点

节点释疑&#xff1a; 父-代表父亲&#xff0c;位置在节点上方 母-代表母亲&#xff0c;位置在节点上方 夫-代表丈夫&#xff0c;位置在节点左前方 妻-代表妻子&#xff0c;位置在节点左前方 兄-代表兄弟&#xff0c;位置在节点右侧 姊-代表姐妹&#xff0c;位置在节点右…

Android复杂问题分析工具bugreportz详解

文章目录 bugreportz详细介绍功能与作用使用方法生成详细报告检查进度bugreportz 的优势分析报告 如何分析1. 解压 ZIP 文件2. 分析主要文件2.1 bugreport.txt2.2 logcat.txt2.3 kernel.log / last_kmsg2.4 events.log2.5 traces.txt2.6 dumpstate_board.txt 3. 工具支持4. 重点…

创意多元化是提升Facebook广告销量的关键

在投放Facebook广告的时候&#xff0c;我们面向的受众是非常广泛的&#xff0c;用户的需求也是非常多样的&#xff0c;打个比方&#xff0c;同样是买一件衣服&#xff0c;有的人注重款式&#xff0c;喜欢新颖的设计&#xff1b;有的人注重质量&#xff0c;更关心面料材质&#…

重学SpringBoot3-集成Redis(七)之分布式限流

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;七&#xff09;之分布式限流 1. 什么是分布式限流&#xff1f;2. 常见的限流算法3. Redis 分布式限流实现3.1. 添加依赖3.2. 配置…

Qt-窗口对话框QMessageBox的使用(51)

目录 前言 描述 使用 自定义按钮 简单方式创建 前言 Qt 提供了多种可复⽤的对话框类型&#xff0c;即 Qt 标准对话框。Qt 标准对话框全部继承于 QDialog类。常⽤标准对话框如下&#xff1a; 描述 消息对话框 QMessageBox 消息对话框是应⽤程序中最常⽤的界⾯元素。消息…

微信点赞的测试用例,应该在哪些方面进行设计!

功能模块测试的测试用例设计方法包括&#xff1a; 等价类划分法&#xff1a;把所有可能的输入数据&#xff0c;即程序的输入域划分成若干部分&#xff0c;然后从每一个部分中选取少数具有代表性的数据作为测试用例。比如字符串长度检查,字符类型检查,标点符号检查,特殊字符检查…

活动预告丨第二十八期 “CCF 开源高校行”暨“木兰技术开放日”活动走进北京大学...

点击蓝字 关注我们 CCF Opensource Development Committee 开源高校行 北京大学站 在数字化转型的浪潮中&#xff0c;开源软件人才的培养是信息技术创新发展的重要根基&#xff0c;高校学子作为我国开源生态的源头活水备受重视。10月9日下午15:00-17:10 “CCF 开源高校行”暨“…

318页PPT5G智慧校园顶层设计方案

2019年&#xff0c;中共中央、国务院印发的《中国教育现代化2035》提出从构建更为完善信息化基础环境、配置学校数字教学资源、建立学校信息化系统运行维护长效机制、统筹建设一体化智能化教学和管理与服务平台等方面建设智能化校园。因此&#xff0c;未来随着信息通信技术的不…

Java项目实战II基于Java+Spring Boot+MySQL的中药实验管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 中药作为中…

龙迅LT8911EXB 高性价比方案MIPICSI/DSI转EDP 1.4 大批量出货产品

龙迅LT891EXB描述&#xff1a; Lontium LT8911EXB是MIPIDSI/CSI到eDP转换器&#xff0c;单端口MIPI接收器有1个时钟通道和4个数据通道&#xff0c;每个数据通道最大运行2.0Gbps&#xff0c;最大输入带宽为8.0Gbps。转换器解码输入MIPI RGB16/18/24/30/36bpp、YUV422 16/20/24b…

huohuo

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

C++网络编程之套接字基础

概述 在网络编程中&#xff0c;套接字&#xff08;Socket&#xff09;是一种用于进程间通信的接口。套接字是操作系统提供的一种抽象层&#xff0c;它允许不同计算机之间的进程通过网络进行通信。套接字实际上并不神秘&#xff0c;简单来说&#xff0c;套接字是连接网络中不同主…

网络安全 IP地址防泄漏指南

IP地址作为每个上网人的“门牌标识号”&#xff0c;如果产生泄露&#xff0c;可能会导致个人行踪曝光、数据被窃取甚至遭受网络攻击&#xff0c;要防止IP地址不被窃取&#xff0c;我们可以尝试以下方法&#xff1a; 利用专用网络加强隐私保护 通过加密在公共网络上创建一条安全…