java--并发

news2025/8/13 18:23:36

并发

  • 1.java的线程状态
    • (1)sleep wait的区别和联系
  • 2.线程池的核心参数
  • 3.lock 和 synchronized
  • 4.volatile能否保证线程安全
  • 5.java中的悲观锁和乐观锁
  • 6.Hashtable和ConcurrentHashMap
  • 7.对ThreadLocal

1.java的线程状态

new 新建:普通的类,还没有和真正的线程关联起来,调用start()之后才会和真正的线程关联起来
RUNNABLE:获取锁之后发现条件不满足,释放锁,进入WAITING等待,会被其他线程唤醒

(1)sleep wait的区别和联系

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

方法归属不同:sleep(long) 是Thread的静态方法
            wait() wait(long) 都是Object的成员方法,每个对象都有

醒来时机不同:执行 wait(long) sleep(long) 的线程都会在等待相应毫秒后醒来
            wait() wait(long) 还可以被notify唤醒,wait()如果不唤醒就一直等下去
            它们都可以被打断唤醒
       
锁特性不同:wait方法的调用必须先获取wait对象的锁,而sleep则无此限制
          wait方法执行后会释放对象锁,允许其他线程获得该对象锁
          而sleep如果在synchronized代码块中执行,并不会释放对象锁

2.线程池的核心参数

corePoolSize:核心线程数目,最多保留的线程数,可以为0
maximumPoolSize:最大线程数目,核心线程+救急线程
keepAliveTime:生存时间,针对救急线程
unit:时间单位,针对救急线程
workQueue:阻塞队列,当核心线程都在使用时,有新任务来了会加入阻塞队列,等核心线程空闲时从阻塞队列中取出执行;当
阻塞队列满了,就会调用救急线程执行任务
handler:拒绝策略,当阻塞队列满了并且线程数达到最大线程数目会使用拒绝策略

3.lock 和 synchronized

(1)语法层面

synchronized是关键字,源码在JVM中,用C++实现的
lock是接口,源码由JDK提供,用java语言实现的
使用synchronized时,退出同步代码块锁会自动释放;而使用lock时,需要手动调用unlock方法释放锁

(2)功能层面

二者均属于悲观锁,都具备基本的互斥、同步、锁重入功能
lock提供了许多synchronized不具备的功能,例如获取等待状态、公平锁、可打断、可超时、多条件变量
lock有适合不同场景的实现,如ReentrantLock,ReentrantReadWriteLock

(3)性能层面

在没有竞争时,synchronized做了很多优化,如偏向锁、轻量级锁,性能较好
在竞争激烈时,lock的实现通常会提供更好的性能

4.volatile能否保证线程安全

线程安全要考虑三个方面:可见性、有序性、原子性
可见性:一个线程对共享变量修改,另一个线程能看到最新的结果
有序性:一个线程内代码按编写的顺序执行
原子性:一个线程内多行代码以一个整体运行,期间不能有其他线程代码插队

volatile能够保证可见性与有序性,不能保证原子性

(1)可见性–不可见的原因

JVM中有一个JIT,会将一些热点的(频繁在内存调用的变量)字节码的机器码缓存起来,这样就会导致某个线程访问到的变量的值一直
都是之前某个时间点访问到的变量的值。这样就会导致即使其他线程已经修改了这个变量,他也不会读取到被修改的变量,这就造成了
不可见。

而如果使用volatile修饰后,JIT就不会去修改这个变量的值了

(2)有序性

有序性的检测需要大量数据进行压力测试
内存屏障:写变量时:保证屏障上边的数据不能在屏障下方再写,所以此时需要把加了volatile的变量放在下边执行
        读变量时:保证屏障下边的数据不能在屏障上方读取,所以此时需要把加了volatile的变量放在上边执行

5.java中的悲观锁和乐观锁

(1)悲观锁

悲观锁的代表是lock 和 synchronized
(1)核心思想是:线程只有占有了锁,才能去操作共享变量,每次只有一个线程占锁成功,获取锁失败的线程都需要停下来等待
(2)线程从运行到阻塞、再从阻塞到唤醒,涉及线程上下文切换,如果频繁发生,影响性能
(3)实际上,线程在获取lock 和 synchronized锁时,如果锁已被占用,都会做几次重试操作,减少阻塞的机会

(2)乐观锁

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

使用CAS时需要配合volatile一起使用

6.Hashtable和ConcurrentHashMap

Hashtable和ConcurrentHashMap都是线程安全的Map集合

(1)Hashtable并发度低,整个Hashtable对应一把锁,同一时刻,只能有一个线程操作他

(2)JDK1.8之前ConcurrentHashMap使用了Segment+数组+链表的结构,每个Segment对应一把锁,如果多个线程访问不同的
Segment,则不会冲突
JDK1.8之后ConcurrentHashMap将数组的每个头节点作为锁,如果多个线程访问的头节点不同,则不会冲突

7.对ThreadLocal

ThreadLocal可以实现资源对象的线程隔离,让每个线程各用各的资源对象,避免争用引发的线程安全问题。
ThreadLocal同时实现了线程内的资源共享

原理:每个线程内有一个ThreadLocalMap类型的成员变量,用来存储资源对象
(1)调用set方法,就是以ThreadLocal自己作为key,资源对象作为value,方法当线程的ThreadLocalMap集合中
(2)调用get方法,就是以ThreadLocal自己作为Key,到当前线程中查找关联的资源值
(3)调用remove方法,就是以ThreadLocal自己作为key,移除当前线程关联的资源值

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

流媒体技术基础-流媒体服务与框架

一、开源流媒体服务器 38款 流媒体服务器开源软件 主流的开源流媒体服务器及框架如下: 1.Live555 [RTSP拉流] 一个为流媒体提供解决方案的跨平台的C开源项目,它实现了对标准流媒体传输协议如 RTP/RTCP、RTSP、SIP等的支持。 实现了对多种音视频编码格…

【毕业设计】机器学习的溢油特征提取与识别

前言 📅大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

城市内涝地埋式积水监测系统解决方案

一、方案背景 近 20 年来,我国城市化进程加快,城市地区由于人口密集,物资财产密度不断加大等特点,高强度暴雨积水形成的洪涝灾害对城市化地区产生的威肋和带来的狠失愈来愈大。由于城市的不断扩建,使工业区、商业区和居…

dos2unix和unix2dos

一 单次转换 用于转换Windows和UNIX的换行符&#xff0c;通常在windows系统中开发的源码文件&#xff0c;换行符是\r\n,二linux中的文件的换行符是\n。如果不转行可能会出错。在windows记事本写一个hello world源码. #include <stdio.h>int main(void) {printf("h…

Jmeter快速入门

Jmeter依赖于JDK&#xff0c;所以必须确保当前计算机上已经安装了JDK&#xff0c;并且配置了环境变量。 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试。 JMeter 最初被设计用于 Web 应用测试&#xff0c;但后来扩展到了其他测试…

【Python百日进阶-WEB开发-冲進Flask】Day182 - Flask蓝图与模板继承

文章目录一、day02项目环境和结构搭建1.1 项目根目录创建apps包1.2 项目模板目录templates创建user子目录二、后端知识要点2.1 蓝图Blueprint基础知识2.1.1 为什么需要蓝图2.1.2 什么是蓝图2.1.3 蓝图的属性2.1.4 蓝图使用的步骤2.1.4.1 创建一个蓝图的包,例如user,并在view.py…

蓝牙耳机什么牌子音质最好?音质超好的蓝牙耳机推荐

蓝牙耳机在便捷性上&#xff0c;没有线材的蓝牙耳机&#xff0c;日常通勤、运动、平时走路佩戴&#xff0c;那种因为无线而带来的无缠绕感觉都是有线耳机无法媲美的&#xff0c;但是音质很多人都会觉得有线的好&#xff0c;由于近几年耳机市场的不断进步&#xff0c;很多蓝牙耳…

《痞子衡嵌入式半月刊》 第 67 期

痞子衡嵌入式半月刊&#xff1a; 第 67 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻&#xff0c;农历年分二十四节气&#xff0c;希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly)&#xff0c;欢迎提交 issue&#xff0c…

8-Arm PEG-Azide,8-Arm PEG-N3,八臂-聚乙二醇-叠氮多臂PEG衍生物供应

1、名称 英文&#xff1a;8-Arm PEG-Azide&#xff0c;8-Arm PEG-N3 中文&#xff1a;八臂-聚乙二醇-叠氮 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Azide PEG Multi-arm PEGs 4、分子量&#xff1a;可定制&#xff0c;八臂-peg 5k-叠氮、八臂PEG 2k叠氮、叠氮-…

卷积神经网络

Datawhale开源学习&#xff0c;机器学习课程&#xff0c;项目地址&#xff1a;https://github.com/datawhalechina/leeml-notes Convolutional Neural Network 本节内容学习了什么是CNN卷积神经网络&#xff0c;相比于全连接网络&#xff0c;它每次只提取部分内容作为整个网络…

专利如果申请?成功率如何提高?

问题一&#xff1a;专利如何申请&#xff1f;​ 1、整理技术方案&#xff0c;整理一套属于你的创新技术方案&#xff1b; 2、专利检索&#xff0c;确保你的创新没有被别人申请过&#xff1b; 3、撰写专利申请书&#xff0c;为了快速审查&#xff0c;做好长期专利布局&#x…

珈创生物上市再次失败:先后折戟科创板、创业板,郑从义为董事长

第二次冲刺上市之旅&#xff0c;珈创生物再次以失败而告终。 11月23日&#xff0c;深圳证券交易所创业板披露的信息显示&#xff0c;因武汉珈创生物技术股份有限公司&#xff08;即“珈创生物”&#xff09;提交了撤回首次公开发行股票并在创业板上市申请文件的申请&#xff0…

医院微信预约挂号小程序开发_分享医院做预约挂号小程序的可以实现什么功能

小程序有 60入口&#xff0c;在微信生态链中无处不在&#xff0c;只要客户是微信用户&#xff0c;他们可以根据搜索、二维码朋友圈找到你的小程序。哪怕是医药行业&#xff0c;也可以做个医院小程序来提高预约和经营运转的效率&#xff0c;解放人力。 1.医院微信预约小程序怎么…

ubuntu下个人觉得必备,好用的应用软件

ubuntu下个人觉得必备&#xff0c;好用的应用软件 本文基于ubuntu20.04 进行讨论。 之前用了很久ubuntu14.04&#xff0c; 因为apt安装依赖的问题&#xff0c;导致系统重装&#xff0c;才被动升级到了20.04. 结果升级后发现了新大陆。 很多原来只能在windows下使用的软件&…

【多目标进化优化】 Pareto 最优解集的构造方法

1. 构造 Pareto 最优解的简单方法 1.1 Deb 的非支配排序方法 \quad\quad设进化群体为 PPP&#xff0c;同时设置一个构造集 P′PP′。算法开始时将第一个个体放人构造集 P′PP′ 中&#xff0c;依次将进化群体 PPP 中的个体 p&#xff08;p∉P′&#xff09;p&#xff08;p∉P&…

护航“东数西算”工程 | 安全狗云原生安全能力亮相2022南京软博会

11月23日&#xff0c;2022中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会&#xff08;简称“2022南京软博会”&#xff09;下的“东数西算”助力数字经济协同发展论坛在南京国际博览中心顺利举办。安全狗也收到邀请出席此次活动。 据悉&#xff0c;此次活…

Flink 结合 HyperScan 问题记录

最近工作需要对公司业务大规模日志进行处理&#xff0c;需要进行通过正则预先匹配出符合条件的日子&#xff0c;经过调研Hyperscan符合预期。 如何提高大规模正则匹配的效能_360技术的博客-CSDN博客 Hyperscan是一款来自于Intel的高性能的正则表达式匹配库。它是基于X86平台以P…

SystemFunction032函数的免杀研究

什么是SystemFunction032函数&#xff1f; 虽然Benjamin Delphi在2013年就已经在Mimikatz中使用了它&#xff0c;但由于我之前对它的研究并不多&#xff0c;才有了下文。 这个函数能够通过RC4加密方式对内存区域进行加密/解密。例如&#xff0c;ReactOS项目的代码中显示&…

(附源码)计算机毕业设计JavaJava毕设项目补课管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

(六)RabbitMQ第二种模型:工作模型(Work Queues)

工作模型&#xff08;Work Queues&#xff09;一、轮询发送消息二、消息应答2.1、概念2.2、自动应答2.3、手动应答2.4、消息的重新入队2.5、手动应答代码概念&#xff1a;工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务&#xff0c;而不得不等待它完成。 相反我…