多线程与高并发

news2025/2/27 2:32:09

1.线程创建的3种方式

2.线程的状态切换步骤

3.线程的5中状态

Java中的线程的生命周期大体可分为5种状态。

1. 新建(NEW):新创建了一个线程对象。

2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。

3. 运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。

4. 阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况分三种: 

(一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。

(二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。

(三). 其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。

5. 死亡(DEAD,称为Terminted更好):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

线程状态图

4.synchronized的底层实现

锁的种类(偏向锁,自旋锁,系统锁),锁的升级

偏向锁,记录这个线程的id,如果线程争用,升级为自旋锁,自旋10次后(默认10次)升级为重量级锁,向系统申请资源.

锁只能升级不能降级

执行时间短(加锁代码),线程数少,用自旋锁

执行时间长,线程数多,用系统锁

5.volatile

6.CAS(jdk1.8是Compare And Swap, jdk11.0是Compare And Set,无锁优化 自旋)

CPU源语支持,中间不能被打断

7.Unsafe

这是jdk1.8的

这是jdk11.0的

increment: sync,atomicXXX,LongAdder

8.CAS新类型锁——Reentrantlock

reentrantlock用于替代synchronized

由于m1锁定this,只有m1执行完毕的时候,m2才能执行

这里是复习synchronized最原始的语义

使用reentrantlock可以完成同样的功能

需要注意的是,必须要必须要必须要手动释放锁(重要的事说三遍)

使用syn锁定的话如果syn代码块执行完或者遇到异常,jvm会自动释放,但是lock必须手动释放锁

使用reentrantlock可以进行尝试锁定trylock,这样无法锁定,或者在指定时间内无法锁定就是放弃锁定

8.2公平锁和非公平锁

通过分析ReentrantLock中的公平锁和非公平锁的实现,其中tryAcquire是公平锁和非公平锁实现的区别,下面的两种类型的锁的tryAcquire的实现,从中我们可以看出在公平锁中,每一次的tryAcquire都会检查CLH队列中是否仍有前驱的 先是检查并设置锁的状态,这种方式会出现即使队列中有等待的线程,但是新的线程仍然会与排队线程中的对头线程竞争(但是排队的线程是先来先服务的),所以新的线程可能会抢占已经在排队的线程的锁,这样就无法保证先来先服务,但是已经等待的线程们是仍然保证先来先服务的,所以总结一下公平锁和非公平锁的区别:

1、公平锁能保证:老的线程排队使用锁,新线程仍然排队使用锁。 

2、非公平锁保证:老的线程排队使用锁;但是无法保证新线程抢占已经在排队的线程的锁。

8.3ReentrantLock和Synchronized的区别

cas和sync的区别

trylock可以尝试获取锁,获取不到就算了

lockinterruptibly 可以实现锁打断

ReentrantLock可以实现公平和非公平锁,Synchronized只有非公平的锁

9.CountDownLatch

10.CyclicBarrier可循环屏障

11.Phaser同步屏障

onAdvance是在栅栏推倒的时候自动调用

12.ReadWriteLock读写锁

读锁就是共享锁,写锁就是排他锁

zookeeper和redis(两种方法)实现分布式锁

13.Semaphore(起限流作用)

Semaphore直接翻译是信号灯的意思,字面理解是信号灯亮的时候才能执行,信号灯不亮的时候不能执行.

  Semaphore s = new Semaphore(2); //如果为1 则表示只允许一个线程同时执行,2则表示允许两个线程同时执行
  new Thread(()->{
    s.acquire(); //每当有一个线程执行acquire()方法后,就会减少1,当为0时,就不能执行了,所以最开始new对象的参数为多少就允许多少个线程同时执行
    s.release();
  })

14.Exchanger(用于线程之间交换数据用的,只能用于两个线程之间交换数据)

15.LockSupport

将当前线程阻塞,阻塞的方法LockSupport.park(),解除阻塞LockSupport.unpark()

16.多线程,高并发面试题

(1)实现一个容器,提供两个方法,add,size

写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束.

(2)写一个固定容量同步容器,拥有put和get方法,以及getCount方法,能够支持2个生产者线程以及10个消费者线程的阻塞调用.

17.源码阅读原则

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

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

相关文章

MySQL1:MySQL发展史,MySQL流行分支及其对应存储引擎,MySQL中一条查询SQL语句是如何执行的?MySQL中一条更新SQL是如何执行的?

MySQL1:MySQL发展史,MySQL流行分支及其对应存储引擎,一条查询SQL语句是如何执行的?一条更新SQL是如何执行的? MySQL发展史MySQL流行分支及其对应存储引擎MariaDB-Maria存储引擎Percona Server-XtraDB存储引擎其它存储引…

VS设置dll加载路径

属性配置-调试-环境: 当存在多个dll路径时,需按图示要求保证计算的值如图格式所示,计算的值:PATH%PATH%;路径;路径; 或者PATH路径;路径;%PATH% 由于qt路径为继承的值,所以将其“从父级或项目默认机床”√取消 上图…

RabbitMQ高级篇 笔记

这是一些高级的内容。 RabbitMQ还是运行在网络上的,倘若遇到了网络故障,mq自己挂了,出异常了,都会造成最终状态不一致的问题。这就是可靠性问题。 可靠性:一个消息发送出去之后,至少被消费1次。 要解决这3个…

vue实现响应式改变scss样式

需求:侧边导航栏点击收起,再次点击展开,但是我这个项目的位置是在左侧菜单栏所以需要自定义 效果图: 实现步骤: 1:定义一个变量(因为我这里会存储菜单栏的状态所以需要存储状态,一…

c语言的程序环境和预处理(一眼丁真)

前言: 正所谓,万物c为首。在我们较为深入的学完c语言之后,可以说是打开了编程的第一扇大门。代码我们会敲了,可是这些代码到底是咋运行起来的呢?这些源文件,头文件里的代码又是怎么“整合”在一起的呢&…

前端数据可视化之【series、series饼图配置】配置项

目录 🌟Echarts配置项🌟series🌟饼图 type:pie🌟写在最后 🌟Echarts配置项 ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观&…

Python装饰器(包装函数、拦截函数)

无参装饰器 decorate: f decorate(f1) f wrapper 有参装饰器 多层装饰器 装饰器带参数 装饰器带参数,3层 案例 import timeisLogin Falsedef login():username input("请输入用户名:")passward input("请输入密码:&q…

HNSW-分层可导航小世界 算法学习

一、knn的缺陷 1. K-NN方法的工作机制 K-Nearest Neighbors (K-NN) 是一种基于实例的分类方法。它通过逐一比较新样本与已有样本的相似度,挑选出与新样本最接近的k个已有样本,然后根据这些样本的类别,通过投票或加权的方式来决定新样本的类…

如何设计实时聊天系统的架构

1. 系统的要求和目标 1.1 功能要求 对话:系统应支持用户之间的一对一和群组对话。确认消息:系统应支持消息传递确认,如已发送、已送达、已读。共享:系统应支持媒体文件的共享,例如图像、视频和音频。聊天存储&#x…

第3章 指令级并行及其利用

3.1 指令级并行:概念和挑战 1985年之后几乎所有处理器都使用流水线来使指令能重叠执行。由于指令可以并行执行,所有指令之间的这种可能得重叠称为指令级并行ILP。 ILP大体有两种实现方法: 1. 依靠硬件来动态发现并实现并行&#xf…

【解决】设置pip安装依赖包路径默认路径在conda路径下,而不是C盘路径下

【解决】设置pip安装依赖包路径默认路径在conda路径下,而不是C盘路径下 问题描述 在win11下安装miniconda,在conda环境里使用pip安装,依赖包总是安装到C盘路径,如 C:\Users\Jimmy\AppData\Local\Programs\Python\Python311\Lib\…

基于.Net CEF 实现 Vue 等前端技术栈构建 Windows 窗体应用

零、参考资料 1、https://github.com/cefsharp/CefSharp/wiki/Quick-Start-For-MS-.Net-5.0-or-greater 2、https://github.com/cefsharp/CefSharp/wiki/Quick-Start 3、https://github.com/cefsharp/CefSharp/wiki/General-Usage#javascript-integration 一、安装 Nuget 包…

计算机网络文章荟萃

脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?-网络编程/专项技术区 - 即时通讯开发者社区! 1.什么是 socket - 掘金2.socket 的实现原理 - 掘金本文讲述了 socket 在 linux 操作系统下的数据结构,以及阻塞 IO 利用…

RHCE---作业3

一.判断磁盘空间 1、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查一次磁盘剩余空间。 # 为了方便测式使用每分钟发送一封邮件,若想要每天定时检查则需要将前两个*改为0 0 [roottimeserver ~]…

Unity protobuf中repeated转C#文件List只读问题

Unity protobuf中repeated转C#文件List只读问题 介绍问题解决方案总结 介绍 工具这里我就不多介绍了,如果有用到ProtoGen工具的可以继续看一下我后面的方法。 问题 如下图所示,我这里随便用了一个.proto文件,看下我这里面的repeated标记的…

el-form动态增减数据的问题,编辑时候input输入不了

新增的时候可以展示&#xff0c;但是编辑在点新增就没有效果 原因&#xff1a;改变了数组内的值&#xff0c;但是页面没有重新渲染 <el-form-item label"信息:" required><div style"display: flex; align-items: flex-end"><div><e…

Spring MVC常用十大注解

Spring MVC常用十大注解 一&#xff0c;什么要使用注解 使用注解可以简化配置&#xff0c;提高代码的可读性和可维护性。通过注解可以实现依赖注入&#xff0c;减少手动管理对象的代码量。注解还支持面向切面编程&#xff0c;实现切面、切入点和通知等。此外&#xff0c;注解提…

maven仓库改国内源

今天准备复现漏洞环境&#xff0c;发现太慢&#xff0c;需要配置国内源 file -> settings 搜索maven 修改settings.xml&#xff0c;这里的需要修改两个文件 1.上图的settings.xml文件 2.idea的maven模块 settings.xml文件将原来的注释掉&#xff0c;然后把阿里的添加上&…

【机器学习合集】激活函数合集 ->(个人学习记录笔记)

文章目录 1. S激活函数(sigmoid&Tanh)2. ReLU激活函数3. ReLU激活函数的改进4. 近似ReLU激活函数5. Maxout激活函数6. 自动搜索的激活函数Swish 1. S激活函数(sigmoid&Tanh) Sigmoid函数在机器学习中经常用作激活函数&#xff0c;但它在某些情况下容易出现梯度消失问题…

QWidget快速美化-蓝色边框圆角按钮

将代码复制进QPushButton的样式表 效果: 代码: QPushButton{ color:#52DCFE;border:2px solid #52DCFE;border-radius:5px; }QPushButton::hover{background-color:#52DCFE;color:#ffffff; }QPushButton::pressed,QPushButton::checked{background-color:#52DCFE;color:#ffff…