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,一经查实,立即删除!

相关文章

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

【Linux系统】—— 基本指令(二) 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驱动版本即可,cuda驱动版本查看命令是nvidia-smi, nvcc -V 是runtimeapi版本可以不用管 1.只要看cuda驱动版本 安装pytorch 选择cuda版本,只要看你电脑cuda驱动版本即可。 2.选择依据 pytorch中cuda版本只…

Flink API 的层次结构

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

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

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

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

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

Redis 中 Bitmap 原理和应用

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

elementUI 点击弹出时间 date-picker

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

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

NEWS | 事件回顾 最近,全球最大的软件公司之一——微软,遭遇了一场罕见的日志丢失危机。据报告,从9月2日至9月19日,持续长达两周的时间里,微软的多项核心云服务,包括身份验证平台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.事务管理(事务进阶) 7.MySQL 索引 1.DQL数据查询语言 分为五大…

恭喜!2024年度大连市科技人才创新、科技人才创业项目拟立项公示!

精选SCI/SSCI/EI SCI&EI ●IEEE 1区TOP 计算机类(含CCF); ●EI快刊:最快1周录用! 知网(CNKI)、谷歌学术期刊 ●7天录用-检索(100%录用),1周上线; 免费稿件评估 …

【前端】-音乐播放器(源代码和结构讲解,大家可以将自己喜欢的歌曲添加到数据当中,js实现页面动态显示音乐)

前言:音乐播放器是前端开发中的一个经典项目,通过它可以掌握很多核心技术,如音频处理、DOM操作、事件监听、动画效果等。这个项目不仅能提升前端开发的技能,还能让开发者深入理解JavaScript与HTML的协同作用。 页面展示&#xff1…

虚拟机linux7.9下安装mysql

1.MySQL官网下载安装包: MySQL :: Download MySQL Community Server https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz 2.解压文件: #tar xvzf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz 3.移动文件&#…

03_CC2530基于定时器3的Delay_ms函数

CC2530定时器3与Delay_ms延时函数 前言 ​ Delay函数是开发中常用到的函数,可以用于按键消抖,LED闪烁,生成一定频率信号等(软件模拟通讯协议)。由于利用循环执行一定次数的空指令实现的延时函数在精度上并不能让人满意,而用定时…

【系统面试篇】其他相关题目——虚拟内存、局部性原理、分页、分块、页面置换算法

目录 一、相关问题 1. 什么是虚拟内存?为什么需要虚拟内存? (1)内存扩展 (2)内存隔离 (3)物理内存管理 (4)页面交换 (5)内存映…

43.第二阶段x86游戏实战2-提取游戏里面的lua

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…

容器内pip安装Apache Airflow的经历:如何重置初始密码

背景 Apache Airflow™https://github.com/apache/airflow 是一个开源平台,用于开发、调度和监控面向批处理的工作流程。Airflow 可扩展的 Python 框架使您能够构建几乎可以连接任何技术的工作流程。Web 界面有助于管理工作流程的状态。Airflow 可以通过多种方式部…

Java爬虫 爬取某招聘网站招聘信息

Java爬虫 爬取某招聘网站招聘信息 一、系统介绍二、功能展示1.需求爬取的网站内容2.实现流程2.1数据采集2.2页面解析2.3数据存储 三、其它1.其他系统实现 一、系统介绍 系统主要功能:本项目爬取的XX招聘网站 二、功能展示 1.需求爬取的网站内容 2.实现流程 爬虫…

stm32不小心把SWD和JTAG都给关了,程序下载不进去,怎么办?

因为想用STM32F103的PA15引脚,调试程序的时候不小心把SWD和JTAD接口都给关了,先看下罪魁祸首 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG,不关SWGPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//关掉SW&am…

雷军-2022.8小米创业思考-11-新零售:用电商思维做新零售,极致的效率+极致的体验。也有弯路,重回极致效率的轨道上。

第十一章 新零售 当我们说到小米模式的时候,其实我们说的是两件东西: 一是小米模式的本质,即高效率的商业模式; 另一件是小米这家公司具象的商业模式,这是小米在实践中摸索、建立的一整套业务模型。 从2015年到202…