并发编程1
JAVA线程回顾
多线程
多个并行的线程来完成个自的任务,优点是程序响应速度更快,程序性能得到提升。
并行执行与并发执行
并发执行就是在单核CPU下,现成实际上是串行执行的,任务调度器将cpu的时间片分给不同的线程使用,但是cpu在线程间的切换很快,给人感觉是同时执行的(微观串行,宏观并行)
并行执行多核cpu下,每个CPU都可以单独调度运行线程,这个时候线程是并行执行的。
多线程带来的问题
线程安全问题
加锁
并发编程
并发编程是一种通过设计程序使其能够同时处理多个任务的编程范式。
目标在于提高资源利用率,增强系统吞吐量。
并发编程 的核心挑战
多线程场景下,对共享资源的访问也是并发执行的
1.不可见性
一个线程对共享变量的修改,其他的线程不能立刻看到,称为不可见性。
JMM(JAVA内存模型):主内存与工作内存

Java内存模型中规定所有变量都存储在主内存中,每个线程都有自己的工作区内存,每个线程在对共享变量进行操作时,必须要从主内存中先读取到工作内存。
2乱序性
指令在执行过程中,为了优化将一些指令的顺序调整了,这种改变肯呢个会影响程序的运行结果。
{int a = 10; //1int b = 20; //2int c = a + b; //3
}
一般情况下会按照123的顺序进行,在一些情况下也会存在213这种情况。
3.非原子性
原子性指一个或多个线程在CPU执行过程中不被中断的特性。
线程切换带来的非原子性问题,像A线程运行中断,切换执行B线程。
解决办法
1.volatile关键字
可以解决不可见性,volatile关键字修饰的变量在一个线程修改后,对其他线程立即可见;
同时解决乱序性,volatile关键字修饰的变量在执行过程中禁止指令重排序。
2.加锁
互斥锁,在A线程执行过程中,其他线程必须等待A线程执行完毕。
synchronized一定能够保证原子性,同时也能解决不可见性与乱序性问题。
3.原子变量
在juc包下面提供的一些类,可以在不加锁的情况下实现++操作的原子性。
这些类称之为原子类。
原子类
原理:通过volatile+CAS机制实现的
加锁是一种阻塞式方式保证原子性
原子变量是一种非阻塞式 的方式保证原子性
CAS(Compare-And-Swap)
CAS是乐观锁的一种实现,采用自旋的思想,是一种轻量级的锁机制。
当一个线程要对共享变量进行操作时,首先从内存中去除共享变量,
记录一个预估值,然后在工作区中进行修改,
当要将修改后的变量虚入主内存之前会判断是否主内存中的值一致,
如果一致说明没有线程对共享变量修改过,
否则需要重新获取共享变量,重复之前的操作。
这种方式线程不会被阻塞,但是在访问量大的情况下,会导致CPU消耗过高。
ABA问题--->使用有版本号的原子类
锁
1.乐观锁/悲观锁
乐观锁:其实就是不加锁,乐观的认为不加锁的并发操作是没有问题的,通常采用CAS算法
悲观锁:认为并发操作时一定会出现问题,使用JAVA中提供的锁进行加锁。
乐观锁适合读操作,悲观锁适合写操作
2.可重入锁
当一个线程进入到一个同步方法中,然后在此方法中要调用另一个同步方法,而且这两个方法共用一把锁,此时线程是可以进入到另一个同步方法中的。
public class Demo {synchronized void setA()throws Exception{System.out.println("A");setB();}synchronized void setB()throws Exception{System.out.println("B");}
}
public class Test {public static void main(String[] args) {Demo demo = new Demo();try {demo.setA();} catch (Exception e) {e.printStackTrace();}}
}
//A
//B
3.读写锁
ReentrantTreaWriteLock
可以实现写锁和读锁,共用一个锁实现;
读读不互斥,读写互斥,写写互斥。
加读锁是防止在另外的线程在此时写入数据,防止赃读。
4.分段锁
并非是实际的锁,而是一种思想,用于将数据分段,并在每一个分段上单独加锁,将锁进一步细粒度化,提高并发效率。
这里是作者的理解:
举个例子,这里有一个hashtable,整个加锁,有多个线程要进行访问,但是有一个锁直接锁住这个hashtable,线程就得排队,并发效率低;
使用分段锁,对hashtable的每一个节点进行加锁,取消之前锁住整体的大锁,多个线程进行访问时,就可以从多个节点往下并行执行,提高了并发效率。
多个线程过来,各个线程只要操作他要的节点下的数据,没有必要将整个hashtable进行加锁,限制了并发效率。
5.自旋锁
类比CAS,自行尝试,当线程抢锁失败后,重试几次
比较消耗CPU,适合加锁时间较短的场景
6.共享锁/独占锁
共享锁:多个线程共用一把锁,并发访问共享资源,读写锁中的读锁
独占锁:一个锁只能被一个线程持有,也叫互斥锁。synchronized,ReentrantLock,读写锁中的写锁
7.公平锁/非公平锁
公平锁:按照请求锁的顺序进行分配,哪个线程先来,哪个线程先获取锁
ReentrantLock底层可以设置为公平锁
非公平锁: 不按照请求顺序分配,哪个线程抢到,哪个线程获得
synchronized,ReentrantLock(默认非公平锁)
8.偏向锁/轻量级锁/重量级锁
针对synchrpnized锁的状态分
无锁:没有任何线程使用锁对象
偏向锁:就是一段代码一直被一个线程访问,这个线程就会自动获取锁
轻量级锁:当锁是轻量级锁时,此时又有别的线程来访问,这时偏向锁就会升级为轻量级锁,其他线程就会通过自旋的方式尝试获取锁,不会阻塞,提高性能。
重量级锁:当锁是轻量级锁时,线程自旋获取达到一定次数还没有获取到锁时,就会进入阻塞,该锁膨胀为重量级锁,获取不到锁的线程进入阻塞,等待操作系统的调度。
作者理解,仅供参考,如有错误,敬请指出!
偏向锁:某一共享资源,除了A线程外没有别的线程来对他进行操作,A就会自动获取锁。
轻量级锁:这时X线程要对这一共享资源进行访问,这时之前的偏向锁就会升级成轻量级锁,X线程只能进行自旋获取锁。
重量级锁:X线程自旋许多次还是无法获取到锁,进入阻塞了,锁这时就是重量级锁,X线程也只能等操作系统来调度了。
这些设计都是Java为了优化synchronized锁
对象结构
对象头中有一块区域MarkWord,储存对象自身运行时数据,就包含锁状态,hash码,GC分代年龄,线程持有的锁,偏向线程ID等。
相关文章:
并发编程1
JAVA线程回顾 多线程 多个并行的线程来完成个自的任务,优点是程序响应速度更快,程序性能得到提升。 并行执行与并发执行 并发执行就是在单核CPU下,现成实际上是串行执行的,任务调度器将cpu的时间片分给不同的线程使用࿰…...
Hadoop之01:HDFS分布式文件系统
HDFS分布式文件系统 1.目标 理解分布式思想学会使用HDFS的常用命令掌握如何使用java api操作HDFS能独立描述HDFS三大组件namenode、secondarynamenode、datanode的作用理解并独立描述HDFS读写流程HDFS如何解决大量小文件存储问题 2. HDFS 2.1 HDFS是什么 HDFS是Hadoop中的一…...
从源到目标:深度学习中的迁移学习与领域自适应实践
云边有个稻草人-CSDN博客 目录 引言 一、迁移学习概述 1.1 迁移学习的类型 1.2 迁移学习的核心思想 1.3 迁移学习的应用场景 二、领域自适应(Domain Adaptation) 2.1 领域自适应的定义 2.2 领域自适应的挑战 2.3 领域自适应的核心方法 &#…...
WebRTC与PJSIP:呼叫中心系统技术选型指南
助力企业构建高效、灵活的通信解决方案 在数字化时代,呼叫中心系统的技术选型直接影响客户服务效率和业务扩展能力。WebRTC与PJSIP作为两大主流通信技术,各有其核心优势与适用场景。本文从功能、成本、开发门槛等维度为您深度解析,助您精准匹…...
使用IDEA如何隐藏文件或文件夹
选择file -> settings 选择Editor -> File Types ->Ignored Files and Folders (忽略文件和目录) 点击号就可以指定想要隐藏的文件或文件夹...
【人工智能】数据挖掘与应用题库(1-100)
1、涉及变化快慢的问题可以考虑使用导数来分析。 答案:对 2、导数的几何意义是曲线在某点处切线的斜率。 答案:对 3、函数在某点的左导数存在,则导数就存在。 答案:错 4、关于梯度下降算法,下列说法错误的是( ) 错误:梯度下降算法能找到函数精确的最小值。 5、正…...
腾讯云大模型知识引擎驱动的DeepSeek满血版医疗顾问大模型搭建实战
文章目录 1. 引言2. 什么是腾讯云大模型知识引擎(LKE)?核心优势功能特点应用场景 3. 模型搭建过程3.1 注册登录产品3.2 创建应用3.3 配置模型3.4 配置角色指令3.5 配置欢迎语3.6 配置知识库3.7 配置工作流3.8 启用联网搜索3.9 发布模型 4. 问…...
大白话页面加载速度优化的工具与实践案例
大白话页面加载速度优化的工具与实践案例 优化工具 Chrome开发者工具:这是个超好用的浏览器自带工具。就像你给车做检查的一套工具一样,能帮你查看页面加载的各种情况。比如说,你能在“Network”(网络)选项里看到每个…...
【JAVA面试题】什么是面向对象?谈谈你对面向对象的理解。
【JAVA面试题】什么是面向对象?谈谈你对面向对象的理解 在 Java 面试中,面向对象 是一个高频考点。它不仅是一种编程思想,更是现代软件开发的核心方法论。本文将从 面向对象的概念、与面向过程的对比、以及 面向对象的三大特性(封…...
解锁责任链模式:Java 实战与应用探秘
系列文章目录 后续补充~~~ 文章目录 一、责任链模式基础入门1.1 责任链模式的定义1.2 核心角色剖析1.2.1 抽象处理者(Handler)1.2.2 具体处理者(ConcreteHandler)1.2.3 客户端(Client) 1.3 类图结构展示 二…...
华为 Open Gauss 数据库在 Spring Boot 中使用 Flyway
db-migration:Flyway、Liquibase 扩展支持达梦(DM)、南大通用(GBase 8s)、OpenGauss 等国产数据库。部分数据库直接支持 Flowable 工作流。 开源代码仓库 Github:https://github.com/mengweijin/db-migrat…...
汽车电子电控软件开发中因复杂度提升导致的架构恶化问题
针对汽车电子电控软件开发中因复杂度提升导致的架构恶化问题,建议从以下方向进行架构优化和开发流程升级,以提升灵活性、可维护性和扩展性: 一、架构设计与模块化优化 分层架构与模块解耦 采用AUTOSAR标准的分层架构(应用层、运行…...
VMware Ubuntu 共享目录
在VMware中挂载Ubuntu共享目录需要以下步骤,分为设置共享文件夹和在Ubuntu中挂载两部分: 一、VMware 设置共享文件夹 关闭Ubuntu虚拟机 在配置前,建议先关闭虚拟机(若已运行需关闭,部分VMware版本支持热添加࿰…...
Linux安装jdk,node,mysql,redis
准备工作: 1.安装VMware软件,下载CentOs7镜像文件,在VMware安装CentOs7 2.宿主机安装Xshell用来操作linux 3. .宿主机安装Xftp用来在宿主机和虚拟机的linux传输文件 案例1:在 /home/soft文件夹解压缩jdk17,并配置环…...
Excel工作圈小工具一个集合了大量Excel功能的绿色工具软件
Excel工作圈小工具 一个集合了大量Excel功能的绿色工具软件,可以大大加强生产效率~ 软件虽然看起来比较简陋,但功能却是十分丰富。无需联网即可运行,而且兼容WPS和MS office各版本。 以下是软件的功能详细截图。 总的来说功能挺丰富&#…...
DeepSeek实操教程(清华、北大)
文末清华大学及北京大学DeepSeek下载地址 1. 地址 2. 提示词 模板:我要(做)xxx,要给xxx用,希望达到xxx效果,但担心xxx问题 3. 软件联动 基本原则:Deepseek生成内容,以其它软件…...
模拟退火算法浅尝
简介 其是模拟物理退火过程而演升出的算法,物理退火过程包含加温过程,等温过程,冷却过程。 模拟退火(SA) 初始设定为高温状态,看作是在解空间进行广域搜,处于低温状态时,看作是在解空间中作局部领域搜索…...
React:B站评论demo,实现列表渲染、删除按钮显示和功能实现、导航栏渲染切换及高亮显示、评论区的排序
功能要求: 1、渲染评论列表 2、删除评论功能:只显示自己评论的删除按钮;点击删除按钮,删除当前评论,列表中不再显示。 3、渲染导航Tab(最新 | 最热)和其 高亮实现 4、评论排序功能实现&…...
支持IPD项目管理的9大系统,哪款工具能有效提高项目控制能力
本文介绍了以下9大系统: 1.Worktile; 2. 腾讯敏捷开发平台(TAPD); 3. 简道云(Jiandaoyun); 4. 蓝鲸智云(BlueWhale); 5. 轻流(Qingflow࿰…...
4070Super安装GPU版本pytorch记录
一些啐啐念。 安装LLaMA-Factory时遇到pytorch安装成CPU版本。网上找了一圈攻略,都是下载龟速。挂梯子也一样。最后在尝试用pytorch官网的生成的命令进行安装时,突然奇想,直接把安装日志显示的下载链接复制到浏览器下载,发现可以满…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
