当前位置: 首页 > news >正文

并发编程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的时间片分给不同的线程使用&#xff0…...

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版本支持热添加&#xff0…...

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&#xff0…...

4070Super安装GPU版本pytorch记录

一些啐啐念。 安装LLaMA-Factory时遇到pytorch安装成CPU版本。网上找了一圈攻略,都是下载龟速。挂梯子也一样。最后在尝试用pytorch官网的生成的命令进行安装时,突然奇想,直接把安装日志显示的下载链接复制到浏览器下载,发现可以满…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...