Java 并发编程学习笔记

参考资料:

JAVA并发专题 - 终有救赎的专栏 - 掘金

Java并发编程学习路线(建议收藏��) | Java程序员进阶之路x沉默王二

面试题目:

JUC第一讲:Java并发知识体系详解 + 面试题汇总(P6熟练 P7精通)-阿里云开发者社区

  • 练气篇 内存模型

第一章 CPU多级缓存模型

1.什么是CPU多级缓存模型?小陈:老王,最近学习并发不知如何入手,看的知识很零散;没多久又记不住了,你有啥好建议吗? - 掘金

  • 第二章 CPU 缓存一致性MESI

4.什么是MESI缓存一致性协议?怎么解决并发的可见性问题?MESI一致性协议 小陈:老王,上一章你让我看看MESI一致 - 掘金

  • 第三章 JMM模型

2.什么是JAVA内存模型?为什么要设计JAVA内存模型? 小陈:老王,看了上一篇的《CPU多级缓存模型》,有个疑问为什 - 掘金

第四章 JMM一致性的实现
 

1.内存可见性

2.禁止指令重排序

6.什么是内存屏障?具有什么作用?什么是内存屏障? 小陈:老王,上一篇你引出了volatile底层是通过内存屏障来解决可 - 掘金

  • 筑基篇  volatile、synchronized

第五章 内存可见性、指令重排、原子性

内存可见性

  • 指令重排

  • 原子性

3.线程安全之可见性、有序性、原子性是什么?小陈:上一篇说了JAVA内存模型,但是后面说了在多线程并发操作的时候有可见性 - 掘金

第六章 Volatile的三性实现

  1. 内存可见性

    2.指令重排

    7.volatile怎么通过内存屏障保证可见性和有序性?volatile通过内存屏障保证可见性 小陈:老王,你上一篇抛出 - 掘金

第七章 Synchronized的基本用法


1.锁加在静态对象上


2.锁加在实例对象上

3.锁在同一实例对象上才互斥,monitorenter申请锁,nonitorexit释放锁。

9.synchronized 是个啥东西?应该怎么使用?synchronized 是什么? 老王:小陈,从今天开始我们就 - 掘金

第八章 Synchronized的底层实现

  1. 对象头


2.Mark word

10.对象头、Mark Word、monitor、synchronized怎么关联起来?老王:开讲啦,开讲啦,小陈快来上 - 掘金
3.锁的升级


12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁小陈:呼叫老王.... - 掘金

第九章 Synchronized的三性实现



1.内存可见性


2.指令重排


3.原子性实现

13.synchronized总结:怎么保证可见性、有序性、原子性?synchronized的原子性 通过前面的篇章我们 - 掘金

结丹篇 CAS

第十章 Unsafe类基本操作

  1. 分配和回收对外内存
  2. 直接访问内存地址上的数据
  3. CAS操作
  4. 挂起和唤醒线程
  5. 读障碍器、写障碍器、全障碍器

14.JDK底层Unsafe类是个啥东西?老王:小陈啊,从今天开始我们就要进入 《结丹篇》 了,在这一篇章里面,要注意听 - 掘金

第十一章 CAS的原子性

  1. 加偏向锁或者轻量级锁
  2. 通知总线独占

15.unsafe类的CAS是怎么保证原子性的?老王:小陈啊,上一章我们讲了usafe是个啥东西,以及unsafe提供的 - 掘金

第十二章 AtomicBoolean、AtomicInteger、AtomicLong

  1. volatile & CAS
  2. 适用于并发较轻的情况

17.AtomicInteger、AtomicBoolean的底层原理小陈:老王啊,今天就要开始Atomic原子类的学习 - 掘金

第十三章 LongAdder
1.当并发较重的情况下,while循环自旋会很浪费时间。
2.使用分段锁方式来提高并发。
19.Atomic系列之LongAdder的底层原理(分段锁提升并发性能)老王:小陈啊,上一章我们讲解了cas的缺陷,无 - 掘金

第十四章 AtomicReference、AtomicStampedReference

  1. AtomicReference解决同时需要更新多个变量的问题
  2. AtomicStampedReference解决ABA问题

18.AtomicReference、AtomicStampReference底层原理。多个变量更新怎么保证原子性?CAS的ABA问题怎么解决? - 掘金

  • 元婴篇 并发锁与框架

第十五章 AQS基础框架

AbstractQueueSynchronizer

tryLock()

tryRelease()

getState()

setState()

Enq()

addWaiter()

Park

Unpark()

Java高级面试必问:AQS 到底是什么? - 知乎

第十六章 ReentrantLock

深入理解Java并发重入锁ReentrantLock | 二哥的Java进阶之路

Volatile +CAS 实现线程互斥访问

关键字

使用方式

公平性

排队队列

性能比较

实现方式

lock

显示加锁和释放锁

非公平锁、公平锁

可在多个condition队列上等待

大部分情况下比synchronized优

Volatile+CAS

synchronized

使用关键字修饰方法、方法块

非公平锁

只能在单个队列上等待

在JDK1.6 JVM对synchronized关键字优化后,性能基本接近

Monitor

第十七章 ReadWriteLock

深入理解Java并发读写锁ReentrantReadWriteLock | 二哥的Java进阶之路

Int state,高位表示读锁数量,低位表示写锁数量。

读锁:持有读锁时,其他线程可继续获取读锁,不可获取写锁。

写锁:持有写锁时,其他线程不可获取读锁,也不可获取写锁。

锁降级

锁降级:是指在获取写锁后,再获取读锁,然后释放写锁,释放读锁。

解决问题:解决某线程写入数据后,接着读取该数据,可能不一致的问题。

第十八章 线程间的通信

Object

wait(), notify(), notifyAll()

使用案例:生产者与消费者1,不能精确通知条件

从根上理解生产者-消费者模式 | 二哥的Java进阶之路

Condition

await(), signal(), signalAll()

使用案例:生产者与消费者2,可精确通知条件里的一个线程

详解 Java Condition 的 await 和 signal 等待通知机制 | 二哥的Java进阶之路

LockSupport

park(), unpark(Thread t)

使用案例:ABC打印问题,可精准通知线程

深入理解Java并发线程阻塞唤醒类LockSupport | 二哥的Java进阶之路

第十九章 框架通信类

Semphore

Exchanger

CountDownLatch

CyclicBarrier

Java并发编程通信工具类 Semaphore、Exchanger、CountDownLatch、CyclicBarrier、Phaser等一网打尽 | 二哥的Java进阶之路

  • 化神篇 并发容器

基础容器

第二十章 CopyOnWriteArrayList

底层实现:写的时候拷贝数据到新数组,然后设置到新的数组引用。

使用场景:读多写少。

CopyOnWriteArrayList实现原理及源码分析-腾讯云开发者社区-腾讯云

第二十一章 ConcurrentLinkedList

底层实现:lock

吊打面试官之Java ConcurrentLinkedQueue | 二哥的Java进阶之路

第二十二章 ConcurrentHashMap

底层实现:1.7 segement 分段锁 1.8 CAS+synchronized

吊打Java面试官之ConcurrentHashMap(线程安全的哈希表) | 二哥的Java进阶之路

BlockingQueue

第二十三章 ArrayBlockingQueue

一把锁,两个等待队列。

第二十四章 LinkedBlockingQueue

两把锁,两个等待队列。

源码深入解析BlockingQueue | 二哥的Java进阶之路

第二十五章 PriorityBlockingQueue

小顶堆取优先级最小的出队列。

PriorityBlockingQueue详解 - 忧愁的chafry - 博客园

第二十六章 SynchronousQueue

作用:放入的线程全部等待消费线程来取(可同时多个线程),事件的及时传递。

底层:非公平通过Stack来实现,公平通过队列来实现。

源码解析Synchronous Queue 这种特立独行的队列 - 知乎

特殊容器

第二十七章 ThreadLocal

一个线程的threadLocalMap可以有多个threadLocal做weak reference key,来保持不同的对象。

ThreadLocal
set(Object value)

Get()

Remove() 不使用的时候记得显式清除。

5000字10张图讲清楚本地变量ThreadLocal | 二哥的Java进阶之路

  • 飞升篇 线程池

第二十八章 ThreadPoolExecutor

  1. 小于coreThread,新建线程;
  2. 大于coreThread, 放入等待队列;
  3. 小于maxThread,新建线程;
  4. 大于maxThread,启用拒绝策略。

newFixed   coreThread ==maxThread, LinkedBlockingQueue 队列无界容易内存溢出

newCached coreThread,Integer.MAX_VALUE, SynchronousQueue 队列无界,效率不高

24张图带你彻底弄懂 Java 线程池 | 二哥的Java进阶之路

第二十九章 ScheduledThreadPoolExecutor

fixedRate 每五分钟一次

fixedDelay 每隔五分一次

深入剖析Java定时任务ScheduledThreadPoolExecutor | 二哥的Java进阶之路

第三十章   ForkJoinPool

ForkJoinPool



深入理解Java并发编程之Fork/Join框架 | 二哥的Java进阶之路

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

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

相关文章

电工领域文档规范引用格式说明

》》国内电工领域的论文引用格式是怎样的? 在国内电工领域的学术论文中,通常采用的引用格式是《中国学术期刊(光盘版)检索与评价数据规范》(简称《规范》)或《文后参考文献著录规则》(GB/T 771…

dom4j实现xml转map,xml转json字符串

dom4j依赖包 <!--dom4j--><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency> map转为json字符串方法很多&#xff0c;这里使用fastjson <!--fastjson 版本…

【Linux系统】—— 基本指令(二)

【Linux系统】—— 基本指令&#xff08;二&#xff09; 1 「alias」命令1.1 「ll」命令1.2 「alias」命令 2 「rmdir」指令与「rm」指令2.1 「rmdir」2.2 「rm」2.2.1 「rm」 删除普通文件2.2.2 「rm」 删除目录2.2.3 『 * 』 通配符 3 「man」 指令4 「cp」 指令4.1 拷贝普通…

Pytorch cuda版本选择(高效简洁版)

简而言之 Pytorch cuda版本选择 只需要低于cuda驱动版本即可&#xff0c;cuda驱动版本查看命令是nvidia-smi, nvcc -V 是runtimeapi版本可以不用管 1.只要看cuda驱动版本 安装pytorch 选择cuda版本&#xff0c;只要看你电脑cuda驱动版本即可。 2.选择依据 pytorch中cuda版本只…

Flink API 的层次结构

Apache Flink 提供了多层 API&#xff0c;每层 API 针对不同的抽象层次和用途&#xff0c;使得开发者可以根据具体需求选择合适的 API 层次。以下是 Flink API 的层次结构及其简要说明&#xff1a;

前端使用PDF.js把返回的base64或二进制文件流格式,实现pdf文件预览

pdf文件预览 简单了解PDF.js代码实现首先&#xff0c;引入依赖实现预览逻辑 简单了解PDF.js PDF.js是一个JavaScript库&#xff0c;可在浏览器中无插件显示PDF文件&#xff0c;提供缩放、翻页、文本搜索等功能。本文介绍了其基本使用方法和示例代码&#xff0c;如添加翻页和搜…

GPU集群上分布式训练大模型

总结一下如何在超算系统上进行预训练大模型的分布式训练 / 微调&#xff0c;文中代码已上传至 github 实验环境 集群1&#xff1a;国家广州超算 星逸A800智能AI集群 GPU&#xff1a;8 * Nvdia Tesla-A800 80G显存 CPU&#xff1a;2 * 28核 Intel Xeon Gold 6348 内存&#xff…

量化交易系统开发-实时行情自动化交易-数据采集流程

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来说说数据采集流程&#xff0c;后…

智能存储解决方案:探索 TDengine 的多级存储功能

在当今数据驱动的时代&#xff0c;如何高效地存储和管理海量数据已成为企业面临的一大挑战。为了应对这一需求&#xff0c;TDengine Enterprise 不仅支持使用对象存储&#xff08;S3&#xff09;&#xff0c;还早已引入了独特的多级存储功能。这一功能不仅能够降低存储成本&…

python爬虫自动库DrissionPage保存网页快照mhtml/pdf/全局截图/打印机另存pdf

目录 零一、保存网页快照的三种方法二、利用打印机保存pdf的方法 零 最近星球有人问如何使用页面打印功能&#xff0c;另存为pdf 一、保存网页快照的三种方法 解决方案已经放在星球内&#xff1a;https://articles.zsxq.com/id_55mr53xahr9a.html当然也可以看如下代码&…

使用 Visual Studio Installer 彻底卸载 Visual Studio方法与下载

使用 VisualStudioUninstaller 卸载 Visual Studio 的详细步骤&#xff08;以管理员权限运行&#xff09; 步骤 1&#xff1a;下载并解压 VisualStudioUninstaller 访问下载工具。 点击下载 解压下载的文件到本地目录&#xff0c;例如&#xff1a;C:\VSUninstaller。 步骤 …

Swift 开发教程系列 - 第12章:协议与协议扩展

协议&#xff08;Protocol&#xff09;是 Swift 的一种重要特性&#xff0c;它定义了实现特定功能的方法、属性或其他要求。通过协议&#xff0c;可以将行为定义从具体实现中分离&#xff0c;使代码更具可读性和扩展性。Swift 的协议支持协议扩展&#xff0c;这一特性允许我们为…

pytorch中model.cuda()的使用

文章目录 前言一、model.cuda()是什么&#xff1f;二、使用步骤1. 检查GPU是否可用2. 选择设备3. 移动模型到选定设备4. 确保数据和模型在同一设备上 三、注意事项总结 前言 本文旨在详细解释在PyTorch框架中model.cuda()方法的使用&#xff0c;以及与之相关的torch.cuda.devi…

Redis 中 Bitmap 原理和应用

Bitmap Redis中的Bitmap&#xff08;位图&#xff09;是一种较为特殊数据类型&#xff0c;它以最小单位bit来存储数据&#xff0c;我们知道一个字节由 8个 bit 组成&#xff0c;和传统数据结构用字节存储相比&#xff0c;这使得它在处理大量二值状态&#xff08;true、false 或…

文件工具类

isImage(MultipartFile file) 检查文件是否是图片类型isExcel(MultipartFile file) 检查文件是否是excel类型checkFileType(MultipartFile file, String... type) 检查文件是否是指定的类型uploadFile(MultipartFile file) 上传文件downloadFile(HttpServletResponse response,…

elementUI 点击弹出时间 date-picker

elementUI的日期组件&#xff0c;有完整的UI样式及弹窗&#xff0c;但是我的页面不要它的UI样式&#xff0c;点击的时候却要弹出类似的日期选择器&#xff0c;那怎么办呢&#xff1f; 以下是elementUI自带的UI风格&#xff0c;一定要一个输入框来触发。 这是我的项目中要用到的…

微软日志丢失事件敲响安全警钟

NEWS | 事件回顾 最近&#xff0c;全球最大的软件公司之一——微软&#xff0c;遭遇了一场罕见的日志丢失危机。据报告&#xff0c;从9月2日至9月19日&#xff0c;持续长达两周的时间里&#xff0c;微软的多项核心云服务&#xff0c;包括身份验证平台Microsoft Entra、安全信息…

2021-04-22 51单片机玩转点阵

理论就不赘述了,网络上多得很,直接从仿真软件感性上操作认识点阵,首先打开ISIS仿真软件,放置一个点阵和电源与地线就可以开始了;由点阵任何一脚连线到地线,另一边对应的引脚就连接到电源,如图:点击运行看是否点亮?看到蓝色与红色的点表示电源正常但是没有任何亮点,这时对调一下…

(十三)JavaWeb后端开发——MySQL2

目录 1.DQL数据查询语言 1.1基本查询 1.2条件查询 where关键字 1.3分组查询 1.4排序查询 1.5分页查询 2.多表设计 3.多表查询——联查 4.多表查询——子查询​ 5.MySQL 事务 6.事务管理&#xff08;事务进阶&#xff09; 7.MySQL 索引 1.DQL数据查询语言 分为五大…

Ubuntu系统电脑没有WiFi适配器

电脑安装了Ubuntu20.04后发现没办法连接WiFi,也找不到WiFi图标,一般来说是因为Ubuntu系统没有网卡驱动,安装一下即可 解决办法如下: 先用网线或者手机开热点连接到到电脑,让电脑有网络可以使用.终端执行更新命令sudo apt updatesudo apt-get install bcmwl-kernel-source 执行s…