当前位置: 首页 > 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官网的生成的命令进行安装时,突然奇想,直接把安装日志显示的下载链接复制到浏览器下载,发现可以满…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...