概述

并行:同一个时间点,多个线程同时执行
并发:同一个时间段,多个线程交替执行,微观上是一个一个的执行,宏观上感觉是同时执行
核心问题:
多线程访问共享数据存在资源竞用问题
不可见性
java内存模型(jmm)
变量数据都存在于主内存里,每个线程还有自己的工作内存(本地内存),规定线程不能直接对主内存中的数据进行操作,只能把主内存的数据加载到自己的工作内存中操作,操作完成后,在写会主内存
这样的设计就引发了不可见性,应该线程在自己的工作内存中操作了数据后,另一个线程也在操作,但是不知道数据已经被另一个线程修改了
乱序性
为了优化指令执行,在执行一些等待时间比较长的执行时,可以把其他的一些执行指令提前执行,提高速度
但是在多线程场景下,就会出现问题
非原子性
线程切换执行带来非原子性
cpu保证原子性执行cpu指令级别的,但是对于高级语言的一条代码,有时是要拆分为多条指令的,线程在执行到某条执行时操作系统会切换到其他线程去执行,这样这条高级语言指令执行就是非原子性的
总结:工作内存的缓存导致了不可见性,指令的优化导致了无序性,线程的切换执行导致了非原子性

volatile关键字

所修饰的变量在一个工作内存中操作后,底层会将工作内存中的数据同步到其他工作内存中,使其立即可见

  1. 确保多线程操作变量时的可见性,当一个线程修改了变量值,新值会立即对其他线程可见
  2. 防止指令重排序的发生
  3. volatile 无法保证变量操作的原子性

如何保证原子性?

解决非原子性问题,都可以通过加锁的方式实现,synchronized和ReentrantLock都可以实现
Java还提供了一种方案,在不加锁的情况下,实现++操作的原子性就是原子类
在java.util.concurrent包下,定义了许多与并发编程相关的处理类,此包一般大家简称为JUC
实现方式:采用CAS(比较并交换)思想,当多个线程对同一个内存数据操作时,假设A线程把主内存数据加载到自己的工作内存中,这个工作内存中的值就是预期值,然后在自己的工作内存中操作后,当写回主内存时,先判断预期值和主内存的值是否一致,如果一致说明还没有其他线程修改,直接写回主内存,一旦预期值和主内存的值不一样,说明有其他线程已经修改过了,线程A需要重新获取主内存的值,重新操作,判断,直到预期值和主内存中的值相同才结束,否则一直判断
由于采用自旋的方式,使得线程都不会阻塞,一直自旋,适合并发量低的场景,如果并发量过大,线程会一直自旋,会导致CPU开销大
还会有一个ABA问题,线程A拿到主内存值后,期间有其他线程已经多次修改内存数据,最终又修改到和线程A拿到的值相同,可以通过带版本号解决

锁分类

乐观锁/悲观锁

乐观锁是一种不加锁的实现,例如原子类,认为不加锁,采用自旋的方式尝试修改共享数据是不会有问题的,悲观锁是一种加锁的实现,例如synchronized和ReentrantLock认为不加锁修改共享数据会出问题

可重入锁

又名递归锁,当同一个线程,获取锁进入到外层方法中,可以在内存中可以进入另一个方法中(内层与外层使用同一把锁)
synchronized和ReentrantLock也是可重入锁

读写锁

ReentrantReadWriteLock读写锁实现
ReentrantReadWriteLockWriteLock()
ReentrantReadWriteLock.ReadLock()
读读不互斥
读写互斥
写写互斥

分段锁

将锁的粒度进一步细化,提高并发效率
hashtable是线程安全的,方法上都加了锁,假如有两个线程同时读,也只能一个一个的读,并发效率低
concurrentHashMap没有给方法上加锁,使用hashtable表中的每个位置上的第一个对象作为锁对象,这样可以多个线程对不同位置进行操作,相互不影响,只有对同一个位置操作时,才互斥
有多吧锁,提高并发操作的效率

自旋锁

线程尝试不断的获取锁,当第一次获取不到时,线程不阻塞,尝试继续获取锁,有可能后面几次尝试后,有其他线程释放了锁,此时就可以获取锁,当尝试获取到一定次数后(默认10次),仍然获取不到任何锁,那么可以进入阻塞状态
synchronized就是自旋锁
并发量低适合自旋锁

共享锁/独占锁

共享锁:可以被多个线程共享,读写锁中的读锁就是共享锁
独占锁:一把锁只能有一个线程使用,读写锁的写锁,synronized和reentrantLock都是独占锁

公平锁/非公平锁

公平锁:可以按照请求获得锁的顺序来得到锁
非公平锁:不按照请求获取锁的顺序来得到锁
synchronized是非公平的
ReentrantLock默认是非公平的,可以通过构造方法去改变成公平锁

锁状态

无锁

偏向锁

一段同步代码块一直由一个线程执行,那么会在锁对象中记录下了线程信息,可以直接会的锁

轻量级锁

当锁状态为偏向锁时,此时又有其他线程访问,锁状态升级为轻量级锁,线程不阻塞,采用自旋方式获取锁

重量级锁

当锁状态为轻量级锁时,如果有大量的线程到来,锁状态升级为重量级锁,自旋的线程会进入阻塞状态,由操作系统去调度管理

Synchronized

关键字,由jvm提供,实现同步,隐式的加锁和释放锁修饰代码块和方法,修饰代码块时需要我们提供一个同步锁对象,任意类的对象都可以,但只能是唯一一个,记录线程有没有进入到同步代码块,修饰方法时,对象是自己提供的,非静态方法锁对象默认为this,静态方法锁对象为当前的class对象,控制同步是依靠进入和退出监视器对象实现的,如果是同步方法,在指令中会为方法添ACC_SYNCHRONIZED标志,如果是同步代码块,在进入到同步代码块时,会执行monitorenter,离开同步代码块时或出异常时,执行monitorexit,为了提高锁的获取与释放效率在对象头中记录锁状态,

AQS

抽象同步队列,是一个实现线程同步的框架,并发包中有很多底层都用到了AQS,通过 FIFO 队列 和 原子状态变量(state) 管理线程的阻塞与唤醒,提供了统一的底层实现机制
核心思想:线程竞争资源时,通过 CAS 操作尝试修改 state 获取资源,成功则直接执行;失败则封装为节点进入队列等待,通过 LockSupport 实现阻塞 / 唤醒。AQS 支持独占(如 ReentrantLock)和共享(如 Semaphore)两种模式,子类只需重写 tryAcquire/tryRelease 等方法即可快速实现自定义同步器,是构建锁、信号量等并发工具的高效底层机制

JUC常用类

ConcurrentHashMap

HashMap适合单线程,不允许多个线程同时访问操作,如果有多线程访问会报异常
Hashtable是线程安全的 直接给方法加锁,效率低
ConcurrentHashMap是线程安全的 没有直接给方法加锁,用哈希表中每一个位置上的第一个元素作为锁对象,哈希表的长度是16,那么就有16把锁对象,锁住自己的位置即可,这样如果多个线程操作不同的位置,那么相互不影响,只有多个线程操作同一个位置,才会等待
如果位置上没有何元素,那么会采用cas机制插入数据到对应位置
hashtable concurrentHashMap 键值都不能为空

CopyOnWriteArrlist

ArrayList是单线程场景下使用的,在多线程场景下会报异常
Vector 是线程安全的,在方法上加了锁,效率低,读写用的同一把锁
CopyOnWriteArrayList  写方法上加了锁(ReentrantLock实现的),写入数据时,先把圆数组做了一个备份,把要添加的数据写入到备份数组中,当写入完成后,在把修改后的数组赋值到原数组中去
给写加锁,读没有加锁,读的效率就变高了,适合写操作少,读操作多的场景

CopyOnWriteArraySet

CountDownLatch

线程池

为减少频繁的创建和销毁线程
JDk5引入了线程池,建议使用ThreadPoolExecutor类来创建线程池,提高了效率

ThreadPoolExecutor  构造器的各个参数:
corePoolSize  核心线程池的线程数量(初始化5)
maximumPoolSize  线程池中最大线程数量(初始化10)
keepAliveTime  空闲线程存活时间当核心线程池中的线程足以应付任务时,非核心线程池中的线程在指定空闲时间到期后,会销毁
unit  时间单位
workQueue  等待队列,当核心线程池中的线程都在使用时,会先将等待的线程放到队列中,如果队列满了,才会创建新的线程(非核心线程池中的线程)
threadFactory  线程工厂,用来创建线程池中的数量
handler  拒绝处理任务的策略
四大策略:AbortPolicy  抛异常
CallRunsPolicy  由提交任务的线程执行,例如在main线程提交,则由main线程执行拒绝任务
DiscardOldestPolicy  丢弃等待时间最长的任务
DiscardPolicy  丢弃最后不能执行的任务

工作流程:

有大量工作任务到来时,先判断核心线程池中的线程是否都忙着,有空闲的就让核心线程池中的线程执行任务,没有空闲的,就判断等待的队列是否已满,如果没满,就把任务添加到队列等待,如果队列已经满了,在判断非核心线程池中的线程是否都忙着,如果有空闲的,,没满,就就由非核心的线程池中的线程执行,如果非核心线程池也满了,就使用对应的拒绝策略处理

提交任务

void ececute 没有返回值
submit  有返回值

关闭线程池

shutdown  执行后不再接收任务,会把线程池中和等待队列中已有的任务执行完后再停止
shutdownNow  立即执行,等待的任务不再执行

ThreadLocal

为每一个线程提供一个变量副本,只在当前线程中使用,相互隔离

实现:为每个Thread创建一个ThreadLocal.ThreadLocalMap threadLocals把变量副本放在ThreadLocal.ThreadLocalMap 中,用ThreadLocal对象统一作为键,每一个获取变量时,先拿到当前线程,拿到线程中的ThreadLocal.ThreadLocalMap 

内存泄漏:对象已经不用了,但是垃圾回收不能回收该对象(例如数据库连接对象,流对象,socket)
不再使用时调用remove方法,删除键值对,可以避免内存泄漏问题

对象引用:
强引用
Object obj=new Object();强引用
对象如果有强引用关联,那么肯定是不能被回收的
软引用
被SoftReference类包裹的对象,当内存充足时,不会被回收,当内存不足时,即使有引用指向,也会被回收
弱引用
被WeakReference类所包裹的对象,只要发生垃圾回收,该类对象都会被回收掉
ThreadLocal被弱引用管理
当发生垃圾回收时,被回收掉,但是value还与外界保持着引用关系,
虚引用
被PhantomReference类包裹的对象,随时都可以被回收,通过虚引用对象跟踪对象回收状态

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

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

相关文章

如何在 Spring Boot 中设计和返回树形结构的组织和部门信息

如何在 Spring Boot 中设计和返回树形结构的组织和部门信息 文章目录如何在 Spring Boot 中设计和返回树形结构的组织和部门信息1. 需求分析一、数据库表设计1.1 organization 表设计1.2 department 表设计1.3 模拟数据二、后端设计2.1 实体类设计Organization 实体类Departmen…

Java毕业设计选题推荐 |基于SpringBoot的水产养殖管理系统 智能水产养殖监测系统 水产养殖小程序

🔥作者:it毕设实战小研🔥 💖简介:java、微信小程序、安卓;定制开发,远程调试 代码讲解,文档指导,ppt制作💖 精彩专栏推荐订阅:在下方专栏&#x1…

排序概念、插入排序及希尔排序

一、排序基本概念1.就地排序:使用恒定的额外空间来产生输出就地排序只是在原数组空间进行排序处理,也就是输入的数组和得到的数组是同一个2.内部排序和外部排序:待排序数据可以一次性载入到内存中为内部排序,反之数据量过大就是外…

【排序算法】④堆排序

系列文章目录 第一篇:【排序算法】①直接插入排序-CSDN博客 第二篇:【排序算法】②希尔排序-CSDN博客 第三篇:【排序算法】③直接选择排序-CSDN博客 第四篇:【排序算法】④堆排序-CSDN博客 第五篇:【排序算法】⑤冒…

Android领域驱动设计与分层架构实践

引言在Android应用开发中,随着业务逻辑日益复杂,传统的MVC或简单MVP架构往往难以应对。领域驱动设计(Domain-Driven Design, DDD)结合分层架构,为我们提供了一种更系统化的解决方案。本文将探讨如何在Android项目中应用DDD原则与分层架构&…

Android12 Framework电话功能UI定制

文章目录简介代码中间按钮Fragment创建VideoCallFragmentFragment管理添加按键挂断电话功能相关文章简介 Android版本:12 芯片平台:展锐 如下图为通话中的UI,打电话出去时显示的UI与此也差不多,但来电时UI是不一样的 这个界面是…

高并发场景下分布式ID生成方案对比与实践指南

高并发场景下分布式ID生成方案对比与实践指南 在分布式系统中,唯一且全局有序的ID生成器是很多业务的底层组件。随着系统并发量不断攀升,如何在高并发场景下保证ID的唯一性、性能、可用性和可扩展性,成为后端架构师需要重点考虑的问题。本文将…

Emscripten 指南:概念与使用

Emscripten 指南:概念与使用 什么是 Emscripten? Emscripten 是一个开源的编译器工具链,用于将 C/C 代码编译成高效的 WebAssembly(Wasm)和 JavaScript。它基于 LLVM 编译器架构,允许开发者: ✅…

使用镜像网站 打开克隆 GitHub 网站仓库内容 git clone https://github.com/

GitHub 网站有时因 DNS 解析问题或网络限制,国内访问可能会受限。使用镜像网站打开网站 使用镜像网站:GitHub 有一些镜像网站,可替代官网访问,如https://hub.fastgit.org、https://gitclone.com、https://github.com.cnpmjs.org等…

Linux随记(二十二)

一、redhat6.5 从openssh5.3 升级到openssh10 - 报错处理【升级后账号密码一直错误 和 sshd dead but subsys locked】 虚拟机测试情况 - 正常:情况一、 升级后账号密码一直错误 情况二、 执行service sshd status出现 sshd dead but subsys locked

机器学习之TF-IDF文本关键词提取

目录 一、什么是 TF-IDF? 1.语料库概念理解 二、TF-IDF 的计算公式 1. 词频(TF) 2. 逆文档频率(IDF) 3. TF-IDF 值 三、关键词提取之中文分词的实现 四、TF-IDF简单案例实现 (1)数据集…

Flutter屏幕和字体适配(ScreenUtil)

一、简介 flutter_screenutil 是一个 Flutter 插件,专门用于处理屏幕适配问题。它简化了不同设备间尺寸差异的处理,确保你的应用在各种屏幕上都能保持良好的显示效果。开发者可以通过简单的调用来设置基于设计图尺寸的控件宽高和字体大小。 项目地址&a…

mimiconda+vscode

安装miniconda实现python包管理,并通过vscode进行编写python代码 miniconda简单介绍 Miniconda 是 Anaconda 公司的一个轻量级 Python 发行版本,它包含了最基本的包管理器 conda 和 Python 环境,只带最核心的组件,没有额外的大量科…

Windows文件时间修改指南:从手动到自动化

修改文件的时间属性可以满足多种需求。比如,它可以帮助整理文件,使得文件按照特定的时间顺序排列,有助于更好地管理资料。它的体积真小,才300多KB。能用来调整文件的创建时间、最后访问和修改时间。文件时间属性修改_NewFileTime.…

能刷java题的网站

以下是一些适合刷Java题的优质网站,涵盖从基础到进阶、算法面试及实战项目等多种需求: ​一、综合编程练习平台​ ​LeetCode​(leetcode.com) ​特点​:全球最知名的算法题库,含海量Java题目,分…

掘金数据富矿,永洪科技为山东黄金定制“数智掘金”实战营

在黄金开采的轰鸣声中,另一场静水深流的“掘金行动”正悄然展开。山东黄金集团,这个行业的巨头,在深挖地层宝藏的同时,也敏锐捕捉到数据洪流中蕴藏的价值富矿。然而,当海量业务数据汇聚,如何从中精准提炼决…

【论文阅读】BEVFormer论文解析及Temporal Self-Attention、Spatial Cross-Attention注意力机制详解及代码示例

BEVFormer: Learning Bird’s-Eye-ViewRepresentation from Multi-Camera Images via Spatiotemporal Transformers|Temporal Self-Attention、Spatial Cross-Attention注意力机制详解 BEVFormer(Bird’s-Eye-View Former)是一种先进的计算机视觉模型&am…

在 Ubuntu 中docker容器化操作来使用新建的 glibc-2.32

在 Ubuntu 中使用容器化操作来使用新建的 glibc-2.32,可以通过创建自定义 Docker 镜像来实现。以下是完整的解决方案: 方案 1:创建包含 glibc-2.32 的 Docker 镜像 1. 创建 Dockerfile dockerfile # 使用 Ubuntu 基础镜像 FROM ubuntu:20.04# 安装编译依赖 RUN apt-get …

GOOUUU ESP32-S3-CAM 果云科技开发板开发指南(二)(超详细!)Vscode+espidf 摄像头拍摄视频实时传输到LCD,文末附源码

书接上回,上一篇blog是使用esp32s3通过ov2640摄像头拍摄到一帧照片,并把它保存到了SD卡中,这第二篇就通过LCD将拍摄到的图片显示到LCD上,本次分享硬件使用的 ESP32-S3-CAM 果云科技开发板,并且使用了配套的LCD扩展板&a…

攻防世界-ics-05(远程文件执行)

一.审题大致浏览一下网页,发现就这边会有东西。看一下源码会不会有东西或者稍微点击一下这个页面的内容看会不会出现东西。点击了一下这个云平台设备维护中心发现url变了,是get的方法传page参数二.尝试漏洞类型自己这边试了sql注入发现不是,试…