2-并发篇

news/2024/4/26 8:18:02/文章来源:https://blog.csdn.net/weixin_45452920/article/details/129043213

线程有哪些状态

java的线程状态有6种:
在这里插入图片描述
操作系统中有5状态的说明
注意java的runnable对应了就绪、运行、阻塞I/O
在这里插入图片描述

线程池的核心参数

主要是说线程池的一个实习类 threadPoolExecutor.class

1.corePoolSize 核心线程数据(可以为0)

最多保留的线程数

2.maximumPoolSize最大线程数目

核心线程+急救线程

3.keepAliveTime生存时间

针对急救线程

4.unit时间单位

针对急救线程

5.workQueue

阻塞队列

6.threadFactory线程工厂

可以为线程创建时起好名字

7.handler拒绝策略

四种

线程池的工作流程:
在这里插入图片描述

sleep 和 wait的区别

共同点:wait() ,wait(long) ,sleep(long)都是让线程暂时放弃cpu的使用权,进入阻塞状态
不同点:

  • .方法归属不同
    1.sleep(long)是Thread的静态方法
    2.而wait(),wait(long)都是Object的成员方法,每个对象都有
  • 醒来的时机不同
    1.执行sleep(long)和wait(long)的线程都会在等待响应毫秒后醒来
    2.wait(long) 和 wait()还可以被notify唤醒,wait()如果不唤醒就一直等下去
    3.他们都可以被打断唤醒
  • 锁特性不同
    1.wait方法的调用必须先获取wait对象的锁,而sleep则无此限制
    2.wait方法执行后会释放对象锁,允许其他线程获得该对象锁(我放弃,但你们还可以用)
    3.而sleep如果在synchronized代码块中执行,并不会释放对象锁(我放弃,你们也用不了)

lock vs synchronized

  • 语法层面
    • synchronized 是关键字,源码在jvm中,用c++语言实现的
    • Lock是接口,源码由jdk提供,用java语言实现
    • 使用synchronized时,退出同步代码块锁会自动释放,而使用Lock时,需要手动调用unlock方法释放锁
  • 功能层面
    • 二者均属于悲观锁、都具备基本的互斥、同步、锁重入功能
    • Lock提供了许多synchronized不具备的功能,例如获取等待状态、公平锁、可打断、可超时、多条件变量
    • Lock有适合不同场景的实现,如ReentrantLock、ReentrantReadWriteLock
  • 性能层面
    • 在没有竞争时,synchronized做了很多优化,如偏向锁、轻量级锁、性能不赖
    • 在竞争激励时,Lock的实现通常会提供更好的性能

volatile 能否保证线程安全

1.线程安全要考虑三个方面:可见性、有序性、原子性

  • 可见性指,一个线程对共享变量修改,另一个线程能看到最新的结果
  • 有序性指,一个线程内部代码按编写顺序执行
  • 原子性指,一个线程内多行代码以一个整体运行,期间不能有其他线程的代码插队
    2.volatile能够保证共享变量的可见性和有序性,但并不能保证原子性
  • 原子性举例
  • 可见性举例 高速重复的并非计算下,被jit优化调了
  • 有序性举例

悲观锁 vs 乐观锁

synchronized 和 lock 都是悲观锁的代表。
1.核心思想是,线程获取锁,才能操作共享变量。获取锁失败的线程,都得停下来等待。
2.线程从运行到阻塞,从阻塞到唤醒,涉及线程的上下文的切换,频繁切换,会影响性能。
3.synchronized 和 lock在获取锁失败的时候,会尝试重新获取几次。减少阻塞的机会

乐观锁的代表是 atomicinteger,是用cas(compare and swap一般要配合volatile一起使用的)来保证原子性
1.核心思想是无需加锁,每次只有一个线程能成功修改共享变量,其他失败的线程不需要停止,不断重试直至成功
2.由于线程一直运行,不需要阻塞,因此不涉及线程上下文切换。
3.它需要多核CPU支持,且线程不应超过CPU核数

HashTable vs ConcurrentHashMap

1.hashTable 和ConcurrentHashMap 都是线程安全的Map集合
2.Hashtable 并发度低,整个Hashtable对应一把锁,同一时刻,只能有一个线程操作它
3.1.8之前ConcurrentHashMap使用了segment+数组+链表的结构,每个Segment对应一把锁,如果多个线程访问不同的Segment,则不会冲突
4.1.9开始ConcurrentHashMap将数组的每个头节点作为锁,如果多个线程访问的头结点不同,则不会冲突

谈一谈对ThreadLocal的理解

1.ThreadLocal可以实现【资源对象】的线程隔离,让每个线程各用各的【资源对象】,避免争用引发的线程安全问题 。
2.ThreadLocal 同时实现了线程内的资源共享。
3.其原理是,每个线程内有一个ThreadLocalMap 类型的成员变量,用来存储资源对象

  • 调用set方法,就是以ThreadLocal自己作为key,资源对象作为value,放入当前线程的ThreadLocalMap集合中
  • 调用get方法,就是以ThreadLocal自己作为key,到当前线程中查找关联的资源值
  • 调用remove方法,就是以ThreadLocal自己作为key,移除当前线程关联的资源值

4.ThreadLocalMap里面的key为什么要设计成弱引用

  • thread 可能需要长时间运行(如线程池中的线程),如果key不再使用,需要在内存不足(GC)时释放其占用的内存
  • 但GC仅是让key的内存释放,后续还要根据key是否为null来进一步释放值的内存,释放时机有:
    • 获取key发现null key
    • set key时,会使用启发式扫描,清除临近的null key,启发次数与元素个数,是否发现null key有关
    • remove时(推荐),因为一般使用ThreadLocal时都把它作为静态变量,因此GC无法回收

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

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

相关文章

JavaTCP通信程序

3 TCP通信程序 3.1 TCP通信原理 TCP通信协议是一种可靠的网络协议, 它在通信的两端名建立一个Socke对象, 从而在通信的两端形成网络虚拟链路一旦建立了 虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信Java对基于TCP协议的的网络提供…

Python-生成列表

1.生成列表使用列表前必须先生成列表。1.1使用运算符[ ]生成列表在运算符[ ]中以逗号隔开各个元素会生成包含这些元素的新列表。另外,如果[ ]中没有元素就会生成空列表示例>>> list01 [] >>> list01 [] >>> list02 [1, 2, 3] >>…

LeetCode 206. 反转链表

LeetCode 206. 反转链表 难度:easy\color{Green}{easy}easy 题目描述 给你单链表的头节点 headheadhead ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2&a…

Java Stream、File、IO 超详细整理,适合新手入门

目录 Java Stream Java File Java IO Java Stream Java Stream 是 Java 8 中引入的一种新的抽象数据类型,它允许开发人员使用函数式编程的方式来处理集合数据。 使用 Java Stream 可以方便地进行过滤、映射、排序和聚合等操作。下面是一个简单的示例:…

BatchNorm与LayerNorm的比较

Batch Normalization存在的一些问题 (1)BN在mini-batch较小的情况下不太适用 BN是对整个mini-batch的样本统计均值和方差 当训练样本数很少时,样本的均值和方差不能反映全局的统计分布信息,从而导致效果下降 (2&am…

IM即时通讯构建企业协同生态链

在当今互联网信息飞速发展的时代,随着企业对协同办公要求的提高,协同办公的定义提升到了智能化办公的范畴。大多企业都非常重视构建连接用户、员工和合作伙伴的生态平台,利用即时通讯软件解决企业内部的工作沟通、信息传递和知识共享等问题。…

【NestJS】JWT 鉴权

Passport 是一个 NodeJS 鉴权库 JWT 认证的交互流程:浏览器发起请求,服务端对用户名和密码进行验证。如果身份验证通过,服务端会基于用户信息生成 token 字符串,并将其响应给浏览器。浏览器会将 token 字符串存储起来。往后的每次…

vscode远程调试python

目的 注意:这里我们想要实现的是:用vscode 使用remote ssh打开project,然后直接在project里面进行debug,而不需要 在本地vscode目录打开一样的project。 假设大家已经会使用remote ssh打开远程服务器的代码了,那么只…

Photon Vectorized Engine 学习记录

Photon Hash Aggregation Vectorization Photon Hash Join 的向量化的要点是:使用开放地址法。步骤: 向量化计算 hash 值基于 hash 向量化计算 bucket 下标,得到 bucket index 向量基于 bucket index 向量中记录的下标找到 bucket&#xff…

(考研湖科大教书匠计算机网络)第六章应用层-第四节:域名系统DNS

获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:DNS概述二:层次域名结构(1)概述(2)顶级域名分类(3)因特网命名空…

部署跨云容灾的五大难点

为什么企业需要跨云容灾? 据统计,全球已有70%的企业使用云计算服务。上云帮助企业更高效地管理数据资产,但它并非绝对安全。如停电、漏水等机房事故;地震、火灾等自然性灾害;亦或是人为失误,都有可能造成数…

视频技术基础知识

一、视频图像基础 像素:图像的基本单元,即一个带有颜色的小块分辨率:图像的大小或尺寸,用像素个数来表示。原始图像分辨率越高,图像就越清晰位深:存储每位像素需要的二进制位数;位深越大&#…

华为OD机试 C++ 实现 - 第 N 个排列

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

模电学习7. 三极管特性曲线与静态工作点

模电学习7. 三极管特性曲线与静态工作点一、三极管的伏安特性曲线1. 三极管的伏安特性曲线2. 三极管的静态工作点二、合适的静态工作点选择1. 合适静态工作点条件2. 静态工作点的确定三、使用立创EDA仿真查看静态工作点1. 搭建如下图所示测试电路2. 点击菜单仿真、仿真设置3. 运…

springboot整合springdata jpa全能书

一:spring data jpa介绍 spring data:其实spring data就是spring提供了一个操作数据的框架。而spirng data jpa只是spring data框架下的一个基于jpa标准操作数据的模块。 spring data jpa:基于jpa的标准对数据进行操作。简化操作持久层的代码。只需要编…

【离线数仓-4-数据仓库设计】

离线数仓-4-数据仓库设计离线数仓-4-数据仓库设计1.数据仓库分层规划2.数据仓库构建流程1.数据调研1.业务调研2.需求分析3.总结2.明确数据域3.构建业务总线矩阵&维度模型设计4.明确统计指标1.指标体系相关概念1.原子指标2.派生指标3.衍生指标2.指标体系对于数仓建模的意义5…

儿童全脑九大能力,3-6岁的家长都应该知道

什么是全脑? 人的大脑分左右两个半球,形态虽然相似,功能却各有不同。其中,左脑负责文字、数学、计算、分析、逻辑、顺序、事实和记忆,掌管右侧肢体的感觉和运动;右脑则负责颜色、音乐、想象、韵律、感觉、…

其它 Composition API

1.shallowReactive 与 shallowRef shallowReactive:只处理对象最外层属性的响应式(浅响应式)。 shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。 什么时候使用? 如果有一个对象数据,结构比较深, …

vue-print-nb使用

下载 pnpm add vue-print-nb --save 全局注册&#xff0c;使用插件的注册方式 或 局部注册自定义指令 import print from vue-print-nb directives: {print } 绑定到点击按钮上 <button v-print"content">Print!</button> 设置配置项-常用 id和popTi…

总结:NodeJS

一、介绍Nodejs就像是Java中的JVM&#xff0c;是js的运行环境。nodejs不是一个js框架&#xff0c;千万不要认为是类似jquery的框架。nodejs的作用和jvm的一样一样的&#xff0c;也是js的运行环境&#xff0c;不管你是什么操作系统&#xff0c;只要安装对应版本的nodejs&#xf…