JAVAEE初阶 多线程进阶(二)

news2024/11/15 9:14:37

多线程进阶相关知识点

    • 一.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.coloradmin.cn/o/1387597.html

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

相关文章

【SpringMVC】—— 如何配置使用SpringMVC(详细步骤)

目录 引言 使用 1、新建模块 2、导入坐标 3、创建SpringMVC控制器类 4、初始化SpringMVC环境 5、初始化Servlet容器,加载SpringMVC环境 6、配置运行 引言 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架,SpringMVC是表现层(web层)的框架,也…

评职称到底能给你带来什么❓❓

对于个人来说的用处: ①升职加薪 职称等级越高,职位越高,可享受的待遇就越高 ②前置资格 早评职称,前置职称就可以早几年拿,才能更快 评审更高级职称 ③提高个人身份 职称是专业技术人员能力和水平的表现,是…

吼!原来教师这样发布学生期末成绩,轻松没烦恼

​随着科技的进步和教育的不断创新,教师发布学生期末成绩的方式也在逐渐发生变化。传统的方式,如纸质成绩单和口头通知,已经不能满足现代教育的需求。那么,教师应该如何更有效地发布学生期末成绩呢? 一、电子成绩单 电…

Unity | AudioSource 无声音

Unity | AudioSource 无声音 你是否也会遇到相同的问题?AudioSource没声音? 解决: 注意查看一下几处声音设置:

Java多线程——并发和并行、实现方法

多线程 并发和并行 实现方法 代码演示 方式一 package com.qiong.thread1;public class MyThread extends Thread{Overridepublic void run() {for (int i 0; i < 20; i) {System.out.println(getName() "Hello World");}} }package com.qiong.thread1;public…

linux 时间同步后还是偏移

通过crond 设置定时一分钟同步一次时间&#xff1b; 查看日志每次同步都偏移几秒 怀疑是其他程序又做了时间同步&#xff1b; 检查发现有chronyd服务在运行。chronyd也是同步时间的服务 最终解决&#xff1a;关闭chronyd或者用chronyd同步时间 systemctl stop chronydsystemc…

如何优雅地使用Jupyter?基本用法及Jupyter插件使用

Jupyter是一种常用的交互式编辑器&#xff0c;下面我将分享Jupyter的基本用法&#xff0c;以及在日常写代码中使用最多的两个Jupyter插件&#xff0c;一个是JupyterLab&#xff0c;另一个用于给代码生成目录&#xff0c;熟练使用这两个插件&#xff0c;可极大提高我们的代码效率…

腾讯云服务器购买指南,2024更新购买步骤

腾讯云服务器购买流程很简单&#xff0c;有两种购买方式&#xff0c;直接在官方活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动…

开源笔记工具AFFiNE本地部署并结合内网穿透

前言 本篇文章讲解Notion开源平替全能知识库工具AFFINE如何本地部署&#xff0c;并实现公网远程访问。AFFiNE 是一个全新的开源项目&#xff0c;旨在克服 Notion 和 Miro 在安全和隐私方面的一些局限性。它的设计目标是帮助用户将会议记录、待办事项、文档中的目标、视频会议白…

L1-025 正整数A+B(Java)

题的目标很简单&#xff0c;就是求两个正整数A和B的和&#xff0c;其中A和B都在区间[1,1000]。稍微有点麻烦的是&#xff0c;输入并不保证是两个正整数。 输入格式&#xff1a; 输入在一行给出A和B&#xff0c;其间以空格分开。问题是A和B不一定是满足要求的正整数&#xff0…

基于Simdroid电子散热模块的电子设备机箱散热设计与优化

一、背景介绍 热设计就是通过合理的散热方式保证良好的热环境&#xff0c;确保电子设备可靠的工作。随着电子技术的迅速发展&#xff0c;电子设备的结构越来越复杂&#xff0c;且越来越趋于小型化&#xff0c;散热问题成为了影响设备可靠性的重要因素。据统计&#xff0c;电子…

NLP(十八):LLM 的推理优化技术纵览

原文&#xff1a;NLP&#xff08;十八&#xff09;&#xff1a;LLM 的推理优化技术纵览 - 知乎 目录 收起 一、子图融合&#xff08;subgraph fusion&#xff09; 1.1 FasterTransformer by NVIDIA 1.2 DeepSpeed Inference by Microsoft 1.3 MLC LLM by TVM 二、模型压…

freerRTOS

使用计数型信号量设计&#xff1a;生产者和消费者模型 代码&#xff0b;结果图

如何检查Post body并作出响应?

如果需要针对POST body中包含的参数对传入的请求作出响应&#xff0c;你打算怎么做&#xff1f;其实在使用Akamai EdgeWorkers的情况下&#xff0c;只需要一些高级MD&#xff08;MetaData&#xff09;技巧&#xff0c;这一切实现起来可以变得非常简单。 Akamai EdgeWorkers是什…

20240115在ubuntu20.04.6下查看显卡信息

20240115在ubuntu20.04.6下查看显卡信息 2024/1/15 17:33 百度&#xff1a;ubuntu查看显卡型号命令 https://linux.xiaosiseo.com/post/6037.html#id4 Ubuntu查看显卡信息命令 小四LINUX7个月前 (05-22)Ubuntu3230 小四LINUX&#xff0c;是小四运营旗下网站&#xff0c;专注LIN…

Kubernetes (十三) 存储——持久卷-动静态分配

一. 简介 二. NFS持久化存储步骤&#xff08;静态分配&#xff09; 1. 集群外…

【翻译】Qt Designer 如何使用资源文件

原文地址&#xff1a;https://doc.qt.io/qt-6/designer-resources.html Qt的资源浏览器是用于管理应用程序资源的工具&#xff0c;可以让开发者方便地查看和管理应用程序中的各种资源文件&#xff0c;例如图像、字体、布局文件、对话框等。 资源浏览器提供了一个可视化的界面&…

leetcode 349 两个数组的集合

题目 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例 2&#xff1a; 输入&#xff1a…

uniapp 权限申请插件(权限使用说明) Ba-Permissions

简介&#xff08;下载地址&#xff09; Ba-Permissions 是一款权限申请插件&#xff0c;支持权限使用说明弹窗&#xff0c;满足市场审核需求。支持自定义权限申请&#xff0c;也支持快速申请定位、相机、媒体、文件、悬浮窗等常见权限。 支持权限使用说明弹窗&#xff0c;满足…

测试人,你还在写用例吗?是什么在支撑着你写?

测试交付的过程&#xff0c;通常是伴随的是一个测试用例生命周期过程&#xff0c;通常有测试需求分析、测试用例设计、测试用例实现、测试用例执行&#xff0c;以及测试用例管理等几个阶段组成。 为什么要有测试用例&#xff1f; 首先测试用例这是测试岗位的基本交付物之一。开…