程序员的护城河-并发编程

  • 👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家
  • 📕系列专栏:Spring源码、JUC源码
  • 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
  • 🍂博主正在努力完成2023计划中:源码溯源,一探究竟
  • 📝联系方式:nhs19990716,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬👀

文章目录

  • 前言
  • 并发编程详解
    • 感慨
    • 进程与线程
    • 线程
    • 线程常用方法及状态
    • 共享资源和线程安全性
    • synchronized底层原理
    • wait notify
    • 线程状态与ReentrantLock
    • Java内存模型
    • Java无锁模型
    • 并发编程大师的原子累加器底层优化原理(与人类的优秀灵魂对话)
    • 不可变设计
    • 手写简易版线程池思路
    • 线程池
    • ReentrantLock原理
    • 读写锁
    • ThreadLocal
    • CompletableFuture
    • 同步协作
    • 线程安全集合
    • 并发编程实践
  • 总结

前言

世间不如意十之八九。如果没办法一次到位,就分阶段实现吧。

并发编程详解

感慨

历时一个月,从一个只知道背八股的选手,到了对JAVA中常见的并发编程知识熟悉,这是一个蜕变,其实并发编程并不是一个单单的部分,当完整的学习完一个体系,就会发现,很多框架、中间件等都有并发编程的思想,比如Redis等,学会并发编程后也代表着真正的打开了走向高阶程序员的大门,这个过程注定是艰辛的,但是收获确实巨大的!!!

为此,奔着笔记和分享的原则,将整个学习体系的思考和研读整理成博客,供他人参考和指正,在此也希望能获得大家宝贵的意见,一起学习,共同进步。

进程与线程

概述进程与线程之间的关系以及简单测试多线程的好处

👉👉👉 剑指JUC原理-1.进程与线程-CSDN博客

线程

主要概述创建线程的方式以及线程运行的原理

👉👉👉 剑指JUC原理-2.线程-CSDN博客

线程常用方法及状态

本章节主要概述了JUC常见的API 以及 几种线程状态 和 其资源占用情况

👉👉👉 剑指JUC原理-3.线程常用方法及状态-CSDN博客

共享资源和线程安全性

本章节详细的介绍了线程安全性,列举多个案例来论述 共享资源读写问题、是否安全

👉👉👉 剑指JUC原理-4.共享资源和线程安全性-CSDN博客

synchronized底层原理

本章节尽可能的去讲解了synchronized 的发展流程,包括Monitor、重量级锁、轻量级锁、偏向锁、自旋优化等等。

👉👉👉 剑指JUC原理-5.synchronized底层原理-CSDN博客

wait notify

本章节主要讲解的是 关于 同步实现 和 异步实现的原理,同步实现通过观察join源码发现其实是一种保护性暂停的策略,而异步实现其实有点像消息队列的感觉,本质上就是 不管生产者传过来过,消费者不会立马消费掉,这里其实使用阻塞队列的思想就可以实现。

👉👉👉 剑指JUC原理-6.wait notify-CSDN博客

线程状态与ReentrantLock

本章节其实主要介绍了 死锁问题的发生以及如何的排查死锁,具体的可以使用jsp + jstack && top + top H + jstack && jconsloe 来排查问题,同时介绍了与synchronized 对比的一种可重入锁 ReentrantLock 的特点。

👉👉👉 剑指JUC原理-7.线程状态与ReentrantLock-CSDN博客

Java内存模型

本章节主要介绍了 Java内存模型 中的 原子性 可见性 有序性的观点,并着重的介绍了如 volatile 内存屏障的相关原理,并且以 高并发下的单例模式举例来论证 三大特性。

👉👉👉 剑指JUC原理-8.Java内存模型-CSDN博客

Java无锁模型

本章节主要介绍了 无锁模型cas具体是什么原理,以及基于cas的原子类,最终剖析了其最底层unsafe的实现,其底层是通过获取偏移量然后再进行比较。

👉👉👉 剑指JUC原理-9.Java无锁模型-CSDN博客

并发编程大师的原子累加器底层优化原理(与人类的优秀灵魂对话)

本章节主要介绍了 原子累加器 LongAdder的底层实现,其性能较好,本质上适合高并发场景的累加,分为有竞争 和 无竞争,有竞争做的优化是 创建一个累加单元数组,并发的去累加,并且针对各种逻辑进行了详细的校验。

但是有利也有弊,其性能非常好,适合高并发场景,但是精准度存在一定的问题

在这里只着重介绍一下 longadder 的 sum操作。

当我们最终获取计数器值时,我们可以使用LongAdder.longValue()方法,其内部就是使用sum方法来汇总数据的。

java.util.concurrent.atomic.LongAdder.sum():

public long sum() {Cell[] as = cells; Cell a;long sum = base;if (as != null) {for (int i = 0; i < as.length; ++i) {if ((a = as[i]) != null)sum += a.value;}}return sum;
}

实现很简单,遍历cells数组中的值,然后累加.

看上去LongAdder的性能全面超越了AtomicLong,而且阿里巴巴开发手册也提及到 推荐使用 LongAdder 对象,比 AtomicLong 性能更好(减少乐观 锁的重试次数),但是我们真的就可以舍弃掉LongAdder了吗?

当然不是,我们需要看场景来使用,如果是并发不太高的系统,使用AtomicLong可能会更好一些,而且内存需求也会小一些。

我们看过sum()方法后可以知道LongAdder在统计的时候如果有并发更新,可能导致统计的数据有误差。

而在高并发统计计数的场景下,才更适合使用LongAdder。

总结

LongAdder中最核心的思想就是利用空间来换时间,将热点value分散成一个Cell列表来承接并发的CAS,以此来提升性能。

LongAdder的原理及实现都很简单,但其设计的思想值得我们品味和学习。

👉👉👉 剑指JUC原理-10.并发编程大师的原子累加器底层优化原理(与人类的优秀灵魂对话)-CSDN博客

不可变设计

本章节主要介绍了 之所以会出现线程安全问题的原因,并结合String 中不可变设计 final 引出享元模式

👉👉👉 剑指JUC原理-11.不可变设计-CSDN博客

手写简易版线程池思路

本章节主要介绍了 一个简易版本线程池的设计思路,其本质其实就是阻塞队列,并且讲 核心线程的run方法重写,使其能够不停地复用,并且在复用的过程中还可以选择那种复用策略,是死等还是超时等待,最后再设计拒绝策略即可。

👉👉👉 剑指JUC原理-12.手写简易版线程池思路-CSDN博客

线程池

本章节主要介绍了真正的线程池,讲解了其几个核心参数 以及 FutureTask实现 和 Tomcat对线程池改造的思路。

👉👉👉 剑指JUC原理-13.线程池-CSDN博客

ReentrantLock原理

本章节首先介绍了AQS指导思想,然后又深入ReentrantLock源码去探究 公平非公平、可重入、可打断、await、signal等原理。

👉👉👉 剑指JUC原理-14.ReentrantLock原理-CSDN博客

读写锁

本章节介绍了基于ReentrantLock得读写锁,其实本质上换汤不换药,虽然分为了读写,但是只需要合理的控制state的高16位 和 低16位即可,同时在等待队列中做好新的标记,新增了shared 和 Ex标记,如果读获取到锁,还需要看看后面还有没有对应shared状态的一并解锁。

👉👉👉 剑指JUC原理-16.读写锁-CSDN博客

ThreadLocal

本章节首先介绍了ThreadLocal的基本使用场景,其次深入对应常用方法的源码,最后 针对可能存在内存泄漏的情况 以及 出现hash冲突时是怎么实现的(使用了线性探测法

👉👉👉 剑指JUC原理-15.ThreadLocal-CSDN博客

CompletableFuture

本章节主要介绍了Future的加强版 CompletableFuture 的使用,其中调用链逻辑有 后一步需要前一步、需要不需要返回值、将所有的结果整合起来等,合理的使用能够极大的提高使用效率,但是 如果使用的话,最好在get处设置超时时间,并配置 complete 返回默认值。

👉👉👉 剑指JUC原理-17.CompletableFuture-CSDN博客

同步协作

本章节主要介绍了信号量同步方面原理,其实还是基于ReentrantLock的思路进行设计,所以可见AQS思想有多么的重要了,其次还介绍了 线程协调。

👉👉👉 剑指JUC原理-18.同步协作-CSDN博客

线程安全集合

本章节主要介绍了常见的第三代线程安全集合,当然得需要先学会其前置知识HashMap,详细介绍了HashMap在多线程的情况下出现的问题,以及ConcurrentHashMap 在不同的版本做的改进,然后还有阻塞队列 以及 CopyOnWrite思想,当然最本质的还是 一致性 和 并发性的问题,这个最直接的体现就是数据库的MVCC 和 LongAddar。

👉👉👉 如果面试也能这样说HashMap,那么就不会有那么多遗憾!-CSDN博客

👉👉👉 剑指JUC原理-19.线程安全集合-CSDN博客

并发编程实践

相信通过前面铺垫的20章,对于并发编程在原理层次应该是非常熟悉的了,在我的认知里,如果学习了原理性的知识而不去实战,那么这样学习是完全没有意义的,所以为了巩固我之所学,一个集成了网络上众多并发实战应用性的专题应运而生,详细的介绍了并发编程到底可以做什么,到底能够解决那些实际的问题,以及其局限性的思考,这些在我眼里是非常重要的,也就是知行合一的过程!

👉👉👉 剑指JUC原理-20.并发编程实践-CSDN博客

总结

学习JUC是完善整个后端体系必不可少的一环,因为很多Java后端的中间件或者框架其本身内部大量的涉及到了JUC的部分,并且也可以在阅读JUC源码的过程中明白思想,其实思想都是互通的,例如ReentrantLock的原理本质上和Redisson 的原理是类似的,那么就可以迅速过度到分布式锁的使用中。

总的来说,当完整的学习完JUC的部分,也相当于内功更胜一步,这比我当初做完谷粒商城的感觉还好,感觉作为程序员的核心素养更强了,感触良多,耗时一个月,其所体现的绝不是这二十一篇文章这么简单,更多的是传递思想,传递动力,我行你也行的态度!!!

最后分享给大家一句我非常喜欢的话吧。

种一棵树最好的时间是十年前,其次是现在

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

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

相关文章

为何公司强调流程员工总是觉得反感?

在企业管理中&#xff0c;流程设计对于提高效率和降低风险至关重要。然而&#xff0c;很多企业在流程设计时常犯一些常见的错误&#xff0c;导致基层员工对流程感到烦扰&#xff0c;甚至产生抵触情绪。本文将通过分析一个企业的报销流程问题&#xff0c;探讨如何优化流程以提高…

开关电源测试方法分享:开关电源关机维持时间的测试步骤、测试标准

开关电源关机维持时间是指切断电源后输出电压下降到稳压范围外为止的时间。关机维持时间是开关电源测试项目之一&#xff0c;测试时需要用到交流电源、电子负载、示波器等测试设备。那么开关电源测试系统要如何测试关机维持时间呢? 开关电源关机维持时间的测试步骤 关机维持时…

[C/C++]数据结构 LeetCode:用栈实现队列

题目描述: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返…

java基础练习缺少项目?看这篇文章就够了(上)!

公众号&#xff1a;全干开发 。 专注分享简洁但高质量的动图技术文章&#xff01; 项目概述 本教程适合刚学习完java基础语法的同学&#xff0c;涉及if语句、循环语句、类的封装、集合等基础概念&#xff0c;使用大量gif图帮助读者演示代码操作、效果等&#xff0c;是一个非常…

如何在 Linux 上部署 RabbitMQ

如何在 Linux 上部署 RabbitMQ 文章目录 如何在 Linux 上部署 RabbitMQ安装 Erlang从预构建的二进制包安装从源代码编译 Erlang RabbitMQ 的安装使用 RabbitMQ Assistant 连接 RabbitMQ Assistant 是一款优秀的RabbitMQ 可视化管理工具&#xff0c;提供丰富的管理功能。下载地址…

9、传统计算机视觉 —— 边缘检测

本节介绍一种利用传统计算机视觉方法来实现图片边缘检测的方法。 什么是边缘检测? 边缘检测是通过一些算法来识别图像中物体之间,或者物体与背景之间的边界,也就是边缘。 边缘通常是图像中灰度变化显著的地方,标志着不同区域的分界线。 在一张图像中,边缘可以是物体的…

2024有哪些免费的mac苹果电脑内存清理工具?

在我们日常使用苹果电脑的过程中&#xff0c;随着时间的推移&#xff0c;可能会发现设备的速度变慢了&#xff0c;甚至出现卡顿的现象。其中一个常见的原因就是程序占用内存过多&#xff0c;导致系统无法高效地运行。那么&#xff0c;苹果电脑内存怎么清理呢&#xff1f;本文将…

【SpringCloud】Eureka基于Ribbon负载均衡的调用链路流程分析

文章目录 前言1.调用形式2.LoadBalancerInterceptor3.负载均衡流程分析3.1 调用流程图3.2 intercept&#xff08;&#xff09;方法3.3 execute&#xff08;&#xff09;方法3.4 getServer()方法3.4 子类的chooseServer&#xff08;&#xff09;方法3.5 getLoadBalancerStats().…

基于Spring Boot 框架的试卷自动生成系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题&#xff0c;今天给大家介绍…

配置Jetson扩展头--配置CSI相机

每个Jetson开发工具包包括几个扩展头和连接器(统称为“头”): 40‑pin expansion header: 让您将Jetson开发工具包连接到现成的树莓派HATs(硬件附加在顶部),如Seeed Grove模块,SparkFun Qwiic产品等。许多引脚可以用作GPIO或“特殊功能I/O”(SFIO),如I2C, I2S等。 CSI conne…

【大连民族大学C语言CG题库练习题】——判断一个矩阵是另一个矩阵的子矩阵

【问题描述】 从标准输入中输入一个N&#xff08;N<9&#xff09;阶矩阵和一个M&#xff08;M<N&#xff09;阶矩阵&#xff0c;判断矩阵M是否是N的子矩阵&#xff0c;若是则输出M在N中的起始位置&#xff0c;若不是则输出-1。若矩阵M能与N中某一区域完全相等&#xff0…

美国网站服务器SSL证书介绍

美国网站服务器的SSL证书也是一种数字证书&#xff0c;由权威数字证书机构CA验证网站的身份后所颁发&#xff0c;可实现浏览器与网站主机之间的数据传输加密。美国网站服务器搭建的网站在安装SSL证书后会在浏览器显示安全锁标志&#xff0c;数据传输协议则从HTTP传统协议升级为…

2024年测试工程师必看系列之fiddler设置手机端抓包全套教程

fiddler设置手机端抓包 安卓手机抓包 第一步&#xff1a;配置电脑和安卓的相关设置 1、手机和fiddler位于同一个局域网内&#xff1b;首先从fiddler处获取到ip地址和端口号&#xff1a; &#xff0c;点击online&#xff0c;最后一行就是ip地址 2、路径&#xff1a;Tools》Op…

NVS 错误码对应的原因

参见文档&#xff1a;esp-idf/components/nvs_flash/include/nvs.h #define ESP_ERR_NVS_BASE 0x1100 /*!< Starting number of error codes */ #define ESP_ERR_NVS_NOT_INITIALIZED (ESP_ERR_NVS_BASE 0x01) /*!< T…

基于单片机的智能家居安保系统(论文+源码)

1.系统设计 本次基于单片机的智能家居安保系统设计&#xff0c;在功能上如下&#xff1a; 1&#xff09;以51单片机为系统控制核心&#xff1b; 2&#xff09;温度传感器、人体红外静释电、烟雾传感器来实现检测目的&#xff1b; 3&#xff09;以GSM模块辅以按键来实现远/近程…

SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡

目录 一&#xff1a;Eureka注册中心 1. Eureka原理 2. 动手实践 ①搭建EurekaServer ②服务注册 ③服务发现 二&#xff1a;Ribbon负载均衡 1. 负载均衡原理 2. 负载均衡策略 3. 懒加载 一&#xff1a;Eureka注册中心 前面已经分析了&#xff0c;无论是SpringCloud还…

【前端学java】复习巩固-Java中的对象比较(14)

往期回顾&#xff1a; 【前端学java】JAVA开发的依赖安装与环境配置 &#xff08;0&#xff09;【前端学 java】java的基础语法&#xff08;1&#xff09;【前端学java】JAVA中的packge与import&#xff08;2&#xff09;【前端学java】面向对象编程基础-类的使用 &#xff08…

南京--ChatGPT/GPT4 科研实践应用

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

云计算赛项容器云2023搭建

部署容器云平台[5 分] 使 用 OpenStack 私 有 云 平 台 创 建 两 台 云 主 机 &#xff0c; 云 主 机 类 型 使 用 4vCPU/12G/100G 类型&#xff0c;分别作为 Kubernetes 集群的 Master 节点和 node 节点&#xff0c; 然后完成 Kubernetes 集群的部署&#xff0c;并完成 Istio …

澳洲猫罐头真实水平如何?我家亲自喂养过的优质猫罐头推荐给大家

当我们选择猫罐头时&#xff0c;要关注它的营养配方是否完整均衡、原料是否新鲜优质以及生产工艺是否科学可靠。只有满足这三个条件的猫罐头&#xff0c;才能称得上是高品质的。 猫罐头要营养均衡&#xff0c;好的配方不能少&#xff1b;猫罐头成品要优质&#xff0c;原材料要…