Java并发编程学习体系

Java后端技术学习体系—韩顺平 文章目录第一部分:Java基础变量、控制结构、OOP(封装,继承,多态)、数组、Java API、异常和处理、集合、泛型、IO、反射、网络通信第二部分:Java高级1. Java多线程/高并发1.1 并发基础互斥同步、非阻塞同步、指令重排、synchronized、 volatile1.2 线程1.3 锁自动锁、偏向锁、可重入锁1.4 线程池1.5 并发容器1.6 JUCexecutor、collections、locks、alomic(原子类)、tools2. 数据结构和算法2.1 数据结构数组(数组问题 阅读详情

一、可见性、原子性、有序性(三大特性)

1. 发生背景

由于cpu、内存、io设备的速度差异,做了以下优化

  • cpu 增加了缓存,以均衡与内存的速度差异
  • 操作系统增加了进程、线程,以分时复用cpu,进而均衡cpu与io设备的速度差异
  • 编译程序优化指令执行次序,使得cpu缓存能够得到更加合理利用

2. 带来的问题(引出三大特性)

现实中的并发问题往往是三种问题的综合症

  • 缓存导致的可见性问题
  • 线程切换带来的原子性问题
    原子性外在表现是不可分割,本质是多个资源有一致性要求 ,保证中间状态对外不可见
  • 编译优化,指令优化带来的有序性问题
    举例:双重检查创建单例对象 可能存在问题,所以要对instance进行volatile语义声明,就可以禁止指令重排序

3. 解决办法

本质:通常是按需禁用缓存以及编译优化,来保证可见性和有序性
保证对共享变量的修改 是互斥的(同一时刻只有一个线程执行),来保证原子性
通俗做法分三种:

(1) vollatile
volatile强制所修饰的变量及它前边的变量刷新至内存,并且volatile禁止了指令的重排序,解决可见性和有序性问题

(2) synchronized
必须保证是同一把锁,互斥,本质上是保证串行执行
在解锁的时候,JVM需要强制刷新缓存,使得当前线程所修改的内存对其他线程可见

(3) final
当一个对象包含final修饰的实例字段时,其他线程能够看到已经初始化的final实例字段,这是安全的

二、java内存模型(两大核心之一)

  1. Java内存模型定义了线程和内存的交互方式

在JMM抽象模型中,分为主内存、工作内存。主内存是所有线程共享的,工作内存是每个线程独有的。线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,不能直接读写主内存中的变量。并且不同的线程之间无法访问对方工作内存中的变量,线程间的变量值的传递都需要通过主内存来完成

在这里的工作内存特指物理内存,是cpu的寄存器和高速缓存的抽象描述。主内存相当于硬件的内存。

  1. 内存间的交互操作
  • Lock(锁定):主内存变量锁定
  • Unlock(解锁):主内存变量解锁
  • Read(读取):主内存变量读取,将值传给工作内存,待Load
  • Load(载入):工作内存变量载入,将Read读到的值,存放到本地副本
  • Use(使用):把工作内存的变量传递给执行引擎
  • Assign(赋值):把从执行引擎接收到的的值赋值给工作内存变量
  • Store(存储):把工作内存的变量值传递给主内存,以便后续的write使用
  • Write(写入):用于主内存变量,把store获得的变量的值放入主内存变量
  1. 内存模型解决并发问题主要采用两种方式:限制处理器优化和使用内存屏障
    语义上,内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。因此,对于敏感的程序块,写操作之后、读操作之前可以插入内存屏障。

三、 happens-before规则(两大核心之一)

本质 :前面一个操作的结果对后续操作是可见的

  1. 程序的顺序性规则
    单线程不会出现有序性问题,原来是happens-before第一条规则限制住了编译器的优化

  2. volatile 变量规则
    写先于读指的是不会因为cpu缓存,导致a线程已经写了,但是b线程没读到的情况

  3. 管程中锁的规则

  4. 线程 start() 规则

  5. 线程 join() 规则

  6. 线程中断规则

  7. 对象终结规则

  8. 传递性(最重要的特性)

四、分工、同步、互斥(构建体系中的三个核心问题)

Java并发知识体系图.png Java并发知识,包含Java并发编程实战,Java并发编程的艺术等书内知识的总结,、看完此图,Java并发编程即入门了 立即下载

相关推荐

JAVA并发编程知识体系.emmx

JAVA并发编程体系梳理脑图

java并发编程知识梳理

1.如何实现处理线程的返回值 (1)主线程等待法 (2)join() (3)通过Callable接口实现,通过FutureTask或线程池获取

w6869012的博客 549

信息安全-入侵检测技术原理与应用

入侵检测技术原理与应用、入侵检测概述、入侵检测技术、入侵检测系统组成与分类、入侵检测系统主要产品与技术指标、入侵检测系统应用

我的个人博客 1万+

Java并发知识体系详解

Java 并发相关知识体系详解,包含理论基础,线程基础,synchronized,volatile,final关键字, JUC框架等内容。

珍惜当下 752

使用python获取同花顺免费版和同花顺远航版自选股数据用于量化交易

在做量化交易时,有时需要在盘中实时监控同花顺自选股的数量,以便灵活地自定义提醒、捕捉买卖时点等。那么,如何使用python获取同花顺自选股数据呢?

tzzqn2008的专栏 3687

海康VisionMaster表面缺陷滤波实战:从参数调优到工业检测避坑指南

本文深入探讨海康VisionMaster表面缺陷滤波技术在工业检测中的应用,从参数调优到ROI绘制与Blob分析的协同策略,提供金属外壳、锂电池铝壳等复杂表面的缺陷检测实战指南。通过多级滤波架构和动态ROI生成法,显著提升检出率至98.7%,误检率低于0.5%,为工业质检提供智能化解决方案。

ujm5678901的博客 330

Java 并发编程知识总结【一】

Java 并发编程知识总结

木子Teng的博客 433

Frida实战:如何用HashMap.put拦截法快速定位安卓App加密参数(附完整脚本)

本文详细介绍了如何使用Frida拦截HashMap.put方法快速定位安卓App加密参数,提供完整脚本和实战案例。通过动态分析技术,相比传统静态分析大幅提升效率,适用于电商、社交、金融等场景的加密参数定位。

jump7的博客 264

Java之并发编程

并行:在同一个时间节点上,同时发生(是真正意义上的同时执行)并发:在一段时间内,对某个事情交替执行并发编程:在例如抢票,抢购,秒杀等等场景下,有大量的请求访问同一个资源。会出现线程安全的问题,所以需要通过编程来控制解决让多个线程依次访问资源,称为并发编程。抽象同步队列是JUC其它锁实现的基础。思路:​ 在类中维护一个state变量,然后还维护一个队列,以及获取锁,释放锁的方法。​ 当线程创建后,先判断state的值,如果为0,没有线程使用,state = 1,执行完成后,再将state = 0。

m0_62254872的博客 2369

Code Ocean 上传代码 手把手教程

对于一些学术期刊,录用前会让把代码上传到Code Ocean上,但上传过程可能会遇到一些问题,小编分享一下自己的上传经验。他们会进行验证,验证通过,将自动发布。点此运行即可,但是运行比较慢。

u014071947的博客 1万+

[后端设计]innovus命令editPin详解?

先放命令,有空慢慢写。

m0_61003348的博客 5738

2024年Java并发编程底层实现原理(不了解这个不敢说懂并发),5年crud经验

外链图片转存中…(img-tMqrdk6f-1714845537408)]

2401_84584740的博客 865

【OpenClaw企业级智能体实战】第24篇:一人公司实战——用Agent Teams同时管理产品、运营、销售(附16个Agent配置方案+全流程指令模板)

当AI智能体从“单一工具”进化为“协同团队”,“一人公司”已从商业概念变为落地现实。2025年中国超1200万个体创业者采用OPC模式,靠AI团队突破人力边界。本文基于OpenClaw Agent Teams框架,拆解“1总指挥+15执行者”的三层AI组织架构,提供覆盖产品、运营、销售全业务的16个Agent分工矩阵、可直接复制的部署代码、通信配置方案与全流程指令模板。通过虚拟案例验证:单人+AI团队可实现月入26万的商业闭环,AI承担90%标准化工作,人力成本降低75000元/月,ROI超3200%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 946

Java基础六关:从环境搭建到并发编程的体系化学习

Java基础不仅是语法知识的堆砌,更是从JVM内存模型到并发编程的体系化认知。理解HashMap底层原理、字符串不可变性、垃圾回收机制等核心概念,才能应对真实工程场景中的性能与线程安全问题。从环境搭建到面向对象,从集合框架到并发编程,每个环节都关乎代码的质量与稳定性。本文以六道关卡梳理Java学习路径,涵盖JDK配置、类加载机制、线程池应用等高频考点,结合面试与实战案例,帮助开发者构建从理论到实践的完整能力体系。

weixin_33428613的博客 298

基于STM32的室内环境监测系统设计与实现

摘要 本文设计了一种基于STM32的室内环境监测系统,通过传感器实时采集温湿度、空气质量、烟雾浓度等数据,并利用Wi-Fi模块上传至云服务器。系统采用STM32F103C8T6作为主控芯片,结合DHT11、MQ系列传感器及BMP280气压传感器实现数据采集,通过ESP8266模块实现远程数据传输。用户可通过手机APP实时查看环境参数,并在数据超标时触发报警。实验表明,系统运行稳定,监测精度高,具有低成本、易扩展等特点,为改善室内环境质量提供了有效解决方案。 关键词:STM32;室内环境监测;传感器;Wi-F

3254968421的博客 221

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

手快有手慢无,阿里内部322页Java并发编程核心讲义学习笔记,你还在等什么?

很多人都说学习是反人性的,开始容易,但是长久的坚持却很难。这个我也认同,我面试的时候,就经常问候选人一个问题:“工作中,有没有一件事你自己坚持了很久,并且从中获益?”如果候选人能够回答出来,那会是整个面试的加分项,因为我觉得,坚持真是一个可贵的品质,一件事情,有的人三分热度,而有的人,一做就能做一年,或者更久。你放长到时间的维度里看,这两种人,最后的成就绝对是指数级的差距。

知识分享官 113

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

学习Java并发编程之前你不得不知道的那点事,java面试感觉啥也不会怎么办

/ 创建固定大小的线程池。

2401_84447417的博客 599

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java 并发编程内部分享PPT分享

.NET程序员转向JAVA领域,必备技术首当其冲就是JAVA Concurrency 并发编程。 最近系统性的学习了 Doug Lea 《JAVA并发编程实战》一书。这书很有嚼劲,进入JAVA技术体系必看书籍之一。 看完之后,在公司内部做了一个简单的分享,主要是普及下.NET程序员转向Java技术后对于并发的基本认识。 PPT中有大量的实例代码,可以自己...

weixin_33881041的博客 150

阿里十五年,只剩下这套Java开发体系了

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!**

Y1567409的博客 666

Java并发体系

见:GitHub - eHackyd/Java_Concurrency: java并发知识体系的学习笔记

qq_26779635的博客 200

【原创】Java并发编程系列1:大纲

【原创】Java并发编程系列1:大纲 一个人能力当中所蕴藏的潜能,远超过自己想象以外。 为什么要学习并发编程 随着现今互联网行业的迅猛发展,其业务复杂度、并发量也在不断增加,对程序的要求变得越来越高,传统的线性模型也越来越不适用。 同时,计算机软硬件技术的发展,也为多程序同时执行提供了底层的保证,使得并发编程成为主流。 “需求端”和“供给端”都为并发编程提供了巨大的应用空间,所以并发编程已经成...

u010575513的博客 278

阿里p8级别的顶级并发编程宝典,给每个有大厂梦的程序猿

并发编程的学习,并没有想象中那么难,加油加油。

知识分享官 213

学java知识怎么记得牢?

很多人在学习java的时候,有一些迷茫,比如翻阅了底层实现原理,或者学习了工作中用不到的一些知识,但过不了多久就忘记了,那么学java知识怎么记得牢?本篇来给大家理一理思路。 学java知识怎么记得牢? 第一点:其实对于初学者很多人都会建议学习一定要做笔记,但是很多同学容易只理解一半,不理解另一半,怎么说呢?他只理解要做笔记,其实我们做笔记的目的是为了记住重点,转化成自己能理解的,而不是让你抄下来,其实就和小时候学习是一样的,老师经常说不要光在下面记,思维上你没有理解,记下来也没有用,之所以记下来是因为

gu1857035894的博客 559
上一篇: 关于学习Java的四个阶段你了解了多少个?
下一篇: Java并发 -- 局部变量
Java_No2
博客等级 码龄7年 20粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值