JAVAEE初阶 多线程进阶(二)

多线程进阶相关知识点

    • 一.CAS
      • 1.1 CAS的原子类
      • 1.2 实现自旋锁
      • 1.3CAS中的ABA问题
      • 1.4 ABA问题的解决
    • 二. callable接口
    • 三.reentrantLock
      • 3.1 reentrantLock与synchronized区别
    • 四.信息量 semaphore
    • 五. CountDownLatch
    • 六. concurrentHashMap
      • 6.1 concurrentHashMap的优点

一.CAS

CAS compare and swap 比较并交换 比较交换的是内存和寄存器中的值
就能原子的完成一些复杂操作,达成无锁化编程.

1.1 CAS的原子类

在这里插入图片描述

1.比较相等
2.如果相等 就将新值赋值给address中
3.返回操作
但上述伪代码并不是原子的

在这里插入图片描述这些代码是在java.util.concurrent.atomic包中的原子类,是基于CAS实现的.

在这里插入图片描述

在这里插入图片描述

1.2 实现自旋锁

在这里插入图片描述

实现自旋锁,如果this.owner不为空 就一直进行"忙等" 循环会一直执行下去
此处自旋的等 虽然没有放弃cpu 但是不会参与调度, 缺点会消耗很多CPU资源

1.3CAS中的ABA问题

CAS的判定本质上是判断是否有其他的线程从中间穿插进来.
我们先看一个例子

在这里插入图片描述
极端情况:
在这里插入图片描述

在t1执行之前 t3线程又给我账户充值了500块钱,我们就分不清楚到底是取了500块钱,还是取了又充值回去的,就会引起一个BUG.

1.4 ABA问题的解决

1.约定数据变化只能是单向的(要增就只能都增)
2.如果必须是双向变化的数据,我们可以引入版本号.版本号的数字就只能是增加或者减少的.

二. callable接口

我们前面学过实现runnable接口来完成线程问题,这里的callable接口有什么不同呢?

  1. runnable接口关注的是过程,而不是结果,所以提供的run方法,返回值为void
  2. callable接口关注的是结果,提供的call方法的返回值就是callable接口的泛型类

在这里插入图片描述

除此之外,在callable接口中,我们为什么不能直接将callable放到Thread的参数里面呢?因为Thread没有提供相应的构造方法,我们需要借助FutureTask来辅助实现

三.reentrantLock

它是一个可重入锁, 与synchronized类似.
reentrantLock提供了两个方法, lock方法和unlock方法,但是如果unlock有时会无法解锁,这是因为碰到return或者异常之后就会执行不到unlock,所以必须将unlock方法与try-finally方法连用.

3.1 reentrantLock与synchronized区别

区别1 : reentrantLock方法提供了tryLock方法
普通的lock方法进行加锁,如果无法加锁,就会阻塞
tryLock方法加锁不成,不会阻塞,会直接返回false

区别2 : reentrantLock提供了公平锁的实现
所谓公平锁就是要遵循先来后到的原则,通过队列记录加锁线程的先后顺序.

区别3: 搭配的等待通知不一样
synchronized搭配的是 wait-notify方法
reentrantLock搭配的是Condition方法

四.信息量 semaphore

信息量表示 可用资源的个数
申请一个资源,可用资源的个数就会减1 称为P操作
释放一个资源,可用资源的个数就会加1 称为V操作

在这里插入图片描述

acquire表示申请一个资源 release表示释放一个资源

五. CountDownLatch

它的目的就是 多线程执行一个任务, 把大的任务拆分成几个部分 ,分给每个线程执行.

在这里插入图片描述

六. concurrentHashMap

我们知道哈希表中有 HashMap , Hashtable 在多线程中,我们知道.HashMap是线程不安全的所以不予考虑. Hashtable在关键方法上都有synchronized加锁,但是我们也不常用, 这就引入了concurrentHashMap

6.1 concurrentHashMap的优点

  1. 缩小了锁的粒度

在这里插入图片描述

在Hashtable中 如果修改两个不同链表中的元素时,不会有线程安全问题.如果是修改同一个链表上的元素时,就会发生锁冲突,有线程安全问题.

在这里插入图片描述

在concurrentHashMap中,给每一个链表都发了一把锁,因此就不会发生锁冲突.线程会更加的安全.

优点2 :充分的使用了CAS的原子操作,减少了加锁.

优点3 : 针对扩容问题,增加了优化
我们知道,在哈希表中有负载因子:描述了桶上平均有多少元素.
哈希表的查找效率是O(1) 但是你超过了原有元素的个数之后,我们要进行扩容,把旧的元素全部添加到新的元素上,如果本身有很多元素的话,会非常消耗时间.
HashMap的做法是一次性的全部扩容,就会非常耗费时间
concurrentHashMap的做法是 一次扩容一部分 分多次来扩容 ,避免了一次性的耗费时间太多的问题.避免出现某一时间段卡的情况.

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

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

相关文章

如何解决csgo搬砖饰品买了跌价的问题

大家好,我是阿阳。 经常有粉丝问:近期是该买还是该抛,每次买了就跌,抛了就涨,太揪心了。 在这聊聊阿阳自己对这个问题的看法,首先大家都知道csgo游戏搬砖从饰品持有时间长短,可以分为两类&…

【Python学习】Python学习20- 面向对象(1)

目录 【Python学习】Python学习20- 面向对象(1) 前言面向对象技术简介类的创建实例:创建实例对象访问属性 Python内置类属性完整代码输出 参考 文章所属专区 Python学习 前言 本章节主要说明Python的面向对象的处理。Python从设计之初就已经…

【Python学习】Python学习19- 异常处理

目录 【Python学习】Python学习19- 异常处理 前言python标准异常异常处理带异常类型语法不带异常类型语法使用except而带多种异常类型try-finally 语句触发异常 参考 文章所属专区 Python学习 前言 本章节主要说明Python的异常处理。 python标准异常 BaseException 所有异常…

中级Python面试问题

文章目录 专栏导读1、xrange 和 range 函数有什么区别?2、什么是字典理解?举个例子3、元组理解吗?如果是,怎么做,如果不是,为什么?4、 列表和元组的区别?5、浅拷贝和深拷贝有什么区别…

微信小程序上传并显示图片

实现效果&#xff1a; 上传前显示&#xff1a; 点击后可上传&#xff0c;上传后显示&#xff1a; 源代码&#xff1a; .wxml <view class"{{company_logo_src?blank-area:}}" style"position:absolute;top:30rpx;right:30rpx;height:100rpx;width:100rp…

在vue中,切换页面之后如何关闭定时器

在vue中&#xff0c;使用了element-ui的框架&#xff0c;点击左侧切换内部页面。 有些页面使用了定时器&#xff0c;在其换到其他页面的时候&#xff0c;希望能够关闭这些定期请求和复杂操作。 那么&#xff0c;切换页面之后如何关闭定时器&#xff1f;vue的创建流程中没找到能…

OWASP漏洞原理启航(第一课)

OWASP Top 10 2021 介紹 漏洞原理启航介绍 OWASP 定义&#xff1a; AI介绍 OWASP (开放Web应用程序和安全项目) 是一个全球性的社区&#xff0c;致力于提供关于Web应用程序安全性的信息、教育和支持。OWASP是一个非盈利组织&#xff0c;由志愿者驱动&#xff0c;旨在提高Web应…

从“精益思想“看机器人的开发与应用:一场科技与效率的完美融合

在科技飞速发展的今天&#xff0c;机器人已经深入到我们的生活和工作之中&#xff0c;成为了提高效率、提升质量的重要工具。然而&#xff0c;如何让机器人的开发和利用更有效率、更精细&#xff0c;这是摆在我们面前的一道难题。此时&#xff0c;"精益思想"的出现&a…

记ubuntu2004通过NetworkManager修改网络的优先级

这里写自定义目录标题 前言步骤 前言 起因在于万恶的校园网&#xff0c;突然台式有线死活没法认证&#xff08;感觉是IP冲突了&#xff1f;另外一台电脑同样的系统就没有问题&#xff0c;连路由器WIFI也是可以的&#xff0c;路由器设置的是桥接模式&#xff0c;有没有大佬提供…

不分青红皂白,美杜莎勒索软件攻击慈善饮用水机构Water for People

据The Record网站消息&#xff0c;1月11日&#xff0c;勒索软件组织美杜莎&#xff08;Medusa&#xff09;在其暗网受害名单网站上列出了 Water for People——一家专为贫困地区提供清洁饮用水的非盈利组织。 美杜莎向该组织索要30万美元赎金&#xff0c;否则将公布被盗信息。W…

表单验证 ---- 在Vue2中使用ElementUI进行表单验证

目录 前言 给表单绑定对应属性 在data中定义数据对象和表单的定义规则 与数据对象双向绑定 对整个表单进行验证 前言 在做项目时&#xff0c;对于表单进行验证是我们必不可少的 例如 搭建一个基本的登录界面 <div class"form"><h1>登录</h1>&…

拼图小游戏(实现游戏主界面)(未连接数据库)

注释&#xff1a; 基于IDEA&#xff0c;创建窗体进行游戏 默认的用户名和密码为&#xff1a;zhangsan,123 lisi,1234 App界面 package marchwho.ui;public class App {public static void main(String[] args) {//登录的窗体new LogInJFrame();//注册的窗体// new Registe…

操作系统复习 九-十二 章

操作系统复习 九-十二 章 文章目录 操作系统复习 九-十二 章第九章 单处理器调度调度的概念调度的时机、切换与过程进程调度方式调度的基本准则进程的挂起态与七状态模型典型的调度算法 第十一章 I/O管理和磁盘调度I/O 设备I/O控制方式I/O子系统的层次结构IO子系统概述IO调度概…

【电子取证篇】蘇小沐的电子取证工具合集在线文档

【电子取证篇】蘇小沐的电子取证工具合集在线文档 弄成了在线表格&#xff0c;记得及时保存&#xff1b;工具永远只是辅助&#xff0c;但不要过多依赖自动化&#xff0c;有难度说明可以提升&#xff0c;既要不断学习也要不停思考&#xff0c;知行合一—【蘇小沐】 【腾讯文档…

Spring Boot中操作数据库的几种并发事务方式

当有多个并发事务时&#xff0c;会发生丢失更新异常。来自一个或多个事务的更新可能会丢失&#xff0c;因为其他事务会用其结果覆盖它。 让我们通过一个例子来检验一下。考虑以下执行事务的方法。 public void withdraw(Long accountId, double amount) { Account account a…

解决防爬虫机制方法(二)

最近为了完成学校的大数据的作业&#xff0c;老师要我们爬一个的网站&#xff0c;里面有还算不错的防爬机制&#xff0c;忙活了几天&#xff0c;总结出一些常见的防爬机制的应对方法&#xff0c;方法均来自个人实战总结&#xff0c;非专业爬虫角度分析 承接上一次讲的方法解决…

OpenAI 悄然更新使用政策

据 The Intercept 报道&#xff0c;OpenAI 近日悄然在其使用政策中删除了「明确禁止将其技术用于军事目的」的措辞。 截至 1 月 10 日&#xff0c;OpenAI 的「使用政策」页面还包括禁止「具有高人身伤害风险的活动」&#xff0c;特别是应用于「武器开发」和「军事和战争」。 而…

MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model

摘要 Diffusion probabilistic model (DPM) recently becomes one of the hottest topic in computer vision. Its image generation application such as Imagen, Latent Diffusion Models and Stable Diffusion have shown impressive generation capabilities, which arouse…

Binder 机制 javanative

一&#xff1a;Binder介绍 Binder是一套ipc通信方案 Binder框架定义了四个角色&#xff1a; Server &#xff0c;Client&#xff0c;ServiceManager &#xff08;以后简称SMgr&#xff09;以及Binder驱动。其中Server &#xff0c;Client&#xff0c;SMgr运行于用户空间&#…

你知道什么是Java中的类型强转吗?

强制类型转换 强转存在与父转子的时候&#xff0c;子转父不需要进行强转&#xff0c;如 Object o "hello"; //String类是Object类的子类&#xff0c;无需进行强转类型强转分为两种情况&#xff1a; Ⅰ、向下转型&#xff1a;将父类对象引用转换为子类对象引用&am…