Java 并发编程学习笔记

news2024/11/24 15:45:45

参考资料:

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.coloradmin.cn/o/2234620.html

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

相关文章

Docker篇(基础命令)

目录 一、启动与停止 二、镜像相关的命令 1. 查看镜像 2. 搜索镜像 3. 拉取镜像 4. 删除镜像 三、容器创建与启动容器 1. 查看容器 2. 创建容器 交互式方式创建容器 守护式方式创建容器 3. 容器启动与停止 四、容器操作命令 1. 文件拷贝 2. 目录(文件…

qt QColorDialog详解

1、概述 QColorDialog是Qt框架中的一个对话框类,专门用于让用户选择颜色。它提供了一个标准的颜色选择界面,其中包括基本的颜色选择器(如调色板和颜色轮)、自定义颜色输入区域以及预定义颜色列表。QColorDialog支持RGB、HSV和十六…

算法练习:904. 水果成篮

题目链接:904. 水果成篮。 题目意思就是可以选取两个种类的水果不能超过两个种类,该种类个数没有限制, 但是一旦超过两个种类的水果就要停止计数。 示例中数组编号就是就是种类,就是不能出现三个不同编号的数。 1.暴力解法&…

JAVA WEB — HTML CSS 入门学习

本文为JAVAWEB 关于HTML 的基础学习 一 概述 HTML 超文本标记语言 超文本 超越文本的限制 比普通文本更强大 除了文字信息 还可以存储图片 音频 视频等标记语言 由标签构成的语言HTML标签都是预定义的 HTML直接在浏览器中运行 在浏览器解析 CSS 是一种用来表现HTML或XML等文…

深度学习:卷积神经网络中的im2col

im2col 是一种在卷积神经网络(CNN)中常用的技术,用于将输入图像数据转换为适合卷积操作的矩阵形式。通过这种转换,卷积操作可以被高效地实现为矩阵乘法,从而加速计算。 在传统的卷积操作中,卷积核&#xff…

【论文阅读】Associative Alignment for Few-shot Image Classification

用于小样本图像分类的关联对齐 引用:Afrasiyabi A, Lalonde J F, Gagn C. Associative alignment for few-shot image classification[C]//Computer Vision–ECCV 2020: 16th European Conference, Glasgow, UK, August 23–28, 2020, Proceedings, Part V 16. Spri…

HCIP-HarmonyOS Application Developer V1.0 笔记(五)

弹窗功能 prompt模块来调用系统弹窗API进行弹窗制作。 当前支持3种弹窗API,分别为: 文本弹窗,prompt.showToast;对话框,prompt.showDialog;操作菜单,prompt.showActionMenu。 要使用弹窗功能&…

【办公类-04-04】华为助手导出照片视频分类(根据图片、视频的文件名日期导入“年-月-日”文件夹中,并转移到“年-月”文件中整理、转移到“年”文件夹中整理)

背景需求 最近带班,没有时间整理照片,偶尔导一次,几个月的照片。发现用电脑版“华为手机助手“中的WLAN连接”与华为手机的“华为手机助手”连接,速度更快、更稳定,不会出现数据线连接时碰碰就断网的问题 1、先打开电…

人工智能技术:未来生活的“魔法师”

想象一下,未来的某一天,你醒来时,智能助手已经为你准备好了早餐,你的智能家居系统根据你的心情和日程安排调整了室内的光线和音乐,而你的自动驾驶汽车已经在门口等你。这不是科幻小说,这是人工智能技术为我…

Golang | Leetcode Golang题解之第538题把二叉搜索树转换为累加树

题目: 题解: func getSuccessor(node *TreeNode) *TreeNode {succ : node.Rightfor succ.Left ! nil && succ.Left ! node {succ succ.Left}return succ }func convertBST(root *TreeNode) *TreeNode {sum : 0node : rootfor node ! nil {if n…

信号带宽和上升沿的关系:【图文讲解】

目录 1:什么是信号带宽 2:带宽计算公式 3:实际应用 这里讨论的信号,是指数字信号,默认为方波信号。 方波是一种非正弦曲线的波形,具有明确的“高”和“低”两个电平值,且占空比(…

大数据新视界 -- 大数据大厂之 Impala 性能优化:从数据压缩到分析加速(下)(8/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

SpringAI QuickStart

Spring AI 官方文档:Spring AI Spring AI 是一个面向 AI 工程的应用框架,其目标是将 Spring 生态系统的可移植性和模块化设计等设计原则应用到AI 领域,并推动将 POJO 作为应用的构建块应用于 AI 领域。 其特点是跨 AI 供应商支持的便携式 A…

Matplotlib | 条形图中的每个条形(patch)设置标签数据的方法

方法一 不使用子图对象如何给形图中的每个条形设置数据 plt.figure(figsize(8, 4)) sns.countplot(xWorkout_Frequency (days/week), datadf)plt.title(会员每周锻炼频率分布) plt.xlabel(锻炼频率 (每周次数)) plt.ylabel(人数)# 获取当前活动的轴对象 ax plt.gca()# 循环遍…

浅析Android Handler机制实现原理

0. 背景描述 Android系统出于对简单、高效的考虑,在设计UI体系时采用了单线程模型,即不会在多个线程中对同一个UI界面执行操作。简单是指单线程模型可以不用考虑和处理在多线程环境下操作UI带来的线程安全问题,高效是指单线程模型下无需通过…

美格智能5G车规级通信模组: 5G+C-V2X连接汽车通信未来十年

自2019年5G牌照发放开始,经过五年发展,我国5G在基础设施建设、用户规模、创新应用等方面均取得了显著成绩,5G网络建设也即将从基础的大范围覆盖向各产业融合的全场景应用转变。工业和信息化部数据显示,5G行业应用已融入76个国民经…

LINUX下的Mysql:Mysql基础

目录 1.为什要有数据库 2.什么是数据库 3.LINUX下创建数据库的操作 4.LINUX创建表的操作 5.SQL语句的分类 6.Mysql的架构 1.为什要有数据库 直接用文件直接存储数据难道不行吗?非得搞个数据库呢? 首先用文件存储数据是没错,但是文件不方…

使用yolov3配置文件训练自己的数据

目录 前言 一、准备数据集 二、创建文件结构 三、格式化文件 1.data文件夹 2.config文件夹 四、修改yolo的配置文件 1.train文件 2.json2yolo文件 3.datasets文件 前言 使用yolov3框架训练自己的数据大致分为这四步: 准备数据集创建文件结构格式化文件 …

vue组件在项目中的常用业务逻辑(3)

获取完后台接口数据后,需将数据在页面中进行动态展示。 一、在getters中简化数据: 二、在search>index.vue中写计算属性,实现将接口的goodsList模块数据展示在vue的search上: 三、1.用v-for循环数据,一共十个&…