线程、线程组、线程池、锁、事务、分布式

1.线程 Thread类 ,可以继承他,复写run方法,然后new一个对象,调用start方法启动。

2.runnable接口,他单独把run方法定义出来了,可以自己实现一个runnable接口,然后new一个runnable对象给到thread的构造方法中,调用thread的start方法

线程中断 - interrupt   再run方法中,你随时可以调用Thread.currentThread().isInterrupted() 方法判断当前线程是否被中断了,然后判断是否继续执行还是终止执行,如果是调用了业务方法,你可以抛出InterruptException异常 让上层方法来判断继续还是终止。

线程停止:stop   他是抛出error,不能进行捕获,是jvm层处理的,他会再线程执行下一个指令的时候终止掉线程操作

中断、停止都会调用 finally 代码块、 closeable资源的close方法(你得定义再try的小括号里面)

中断较为温和,stop较为极端

线程thread参数:name、runnable、threadgroup、tasksize,前面两个可以单个给,前面三个可以两两给或者都给,也可以四个都给。

name名字,不给的话他有个线程数量累加到名字后缀里面,前缀是固定的一个字符串。

runnable:线程要执行的具体任务,thread的run方法默认是调用runnable的run方法

threadgroup:线程组,给线程分配到那个组里面,不给默认是给到调用者当前线程所在组(优先获取System.getSecurityManager(),再获取当前线程组)目的可能是为了后期维护,目前他那个也是拿当前线程组

线程组:相当于是一颗树结构,只会有一个根,因为所有公共构造方法最后都会默认加入到一个parent里面,你又不能new一个没上级的group,除非用反射,调用其他私有构造方法。

线程组记录了上一个线程组、当前线程数、当前线程数组、当前线程组数、当前线程组 数组

注:组设置了守护线程,后续加的线程默认都是守护线程(也可以手动再改),主线程都跑完了,只有守护线程了,jvm会退出,线程不能再运行时候改变性质。

线程池:生产者、消费者模式,有初始大小、最大容量、任务队列、存活时间、时间单位、线程初始工程、拒绝策略

执行方法:

1.execte :没有返回结果的

2.submit:有返回结果(Future)

3.往队列里面手动加:如果没有核心线程再跑,不会执行的

注:如果入参是实现了callable接口,他会返回callable的结果,如果不是就会返回指定的value,不指定,get方法会返回空(这里的结果是要future的get方法去获取)future的get方法是要等待的,等子线程执行完。

线程控制:execute\submit会开启核心线程立即执行,如果核心数量满了,他会存队列里面,如队列满了,他会开启临时线程跑,如超过最大线程数量,会执行拒绝策略,默认是抛出异常让调用者处理,也可以使用其他策略,比如让调用者执行、丢弃当前任务、丢弃队列最前面的任务,或者自定义策略(RejectedExecutionHandler接口)。

他一次并发数量最多是 最大核心线程数量+队列数量 ,超过了就触发拒绝策略。

当队列里面数量没了,临时线程执行完当前任务就会停止,核心线程就会等待(getTask)

线程池关闭  shutdown 会处理完队列里面的任务,  shutdownNow 会中断当前正则执行的线程,然后清空队列,返回当时队列没处理完任务集合

锁:防止资源并发问题,比如:我要改某个资源,别人也要改这个资源,就要用到锁

大类:

乐观锁:修改前拿取一个版本号,修改后对比版本号,一致就修改,不一致就失败,要保证对比和修改的原子性,适合用在并发不是很高的场景

悲观锁:占用一个资源锁住,不让别人修改、读取,然后我处理完了,修改好了,再让别人读取、修改,适合用在并发高的场景。然后为了资源不占用太大可以设置锁等待超时时间。

自旋锁:乐观锁情况:修改失败了再重新操作,悲观锁:锁超时了我再去获取锁;不建议使用,可能导致死锁,或者严格控制重试次数

synchronized关键字 是以某个对象作为锁,非公平的,独占,可重入的,不能自己控制,jvm处理

AQS: java提供抽象的队列锁类,继承了独占锁(记录了当前获取到锁的线程)

队列锁(继承了独占锁,使用了等待队列,双链结构的队列)、

公平锁(lock队列按照时间顺序排序,目的是unlock时让先lock的拿到锁,晚lock的继续等)、

读写锁(分为读锁和写锁,读和读之间不互斥,读和写互斥,也叫共享锁和互斥锁;互斥也就是读锁再lock了,写锁不能lock;写锁lock了, 读锁不能lock;不互斥,也就是读锁lock了,别人也可以lock读锁,同时读;是可重入的(同一种锁情况可以,不同锁的话会死锁,自己和自己纠缠死锁了),重入了多少次就要unlock多少次,可以通过锁对象获取次数)

UNSAFE保证方法的原子性,比较、赋值同时操作等方法,LockSupport有些方法底层也是UNSAFE提供的。

LockSupport  阻塞当前线程  park (一直等下去,直到unpark)、parkUntil(或者到某个时间 - 绝对) 、parkNanos(或者等多少时间 - 相对)

参数:blocker 阻塞者,可以通过LockSupport.getBlocker 获取(需要线程参数)

时间参数:long类型的,通过时间对象getTime获取,他是指距离某个时间点(自行百度吧)的毫秒数。

LockSupport  放行方法unpark 要给一个线程参数,放行谁。(可以放到park前面,这样线程park就可以直接通过,不用等待(必须再start后,否则不行),方便线程调度)

如果有多个地方park,必须开始以及再每个间隔内给一个unpart,如果间隔内给了两个unpart,他会卡住,因为重复给unpark,他只记录一次的

事务:保证一堆读、写操作要么全部成功,要么全部失败,成功了就要保证读的数据正常、写入的数据准确以及不能丢失。

原子性 :对一批操作是独立的,执行了要么成功要么失败,比如:读两条数据,写、改三条数据,不可以我读成功了,写失败了;或者我读失败了,给我写成功了;或者我只写入了一条数据等等。

一致性:我期间读取的数据是准确的,写入的正确的,然后提交成功。比如事务期间读了一条数据,他是4,然后期间别的事务改成了3、5、4,这时候要失败,哪怕他最后的值是4也要失败,所以要加数据版本进行比较,以及期间数据要一次性取出来再处理,如果分开取,期间别的事务修改了,你数据版本比较是检查不出来的(比如 你获取两条数据,A和B,你获取A的时候,B的版本是2,然后别人改了B,版本是3了,你再获取B,这时候你的B版本获取的是3,不是你最开始获取A时候的B了,你提交事务的时候检验B的版本是3是检验不出来的)。

隔离性:事务之间的数据隔离,保证一致性,有读未提交、读已提交、可重复读、事务串行

读未提交:会发生脏读:数据库原本是2,A事务改成了3,没提交,然后B事务读A,结果是3,然后A事务回退,B事务基于A为3的基础上进行其他逻辑处理(实际是2)。(读了错误的数据)

读已提交:会发生幻读:数据库原本是2,A事务读取为2;B事务修改成3,提交了;A事务再去读取成了3。(不能重复的读,每次读都是对的数据,但是数据变动了)

可重复读(oracle没有这个等级,用临时表实现):A事务开始读的时候是2,B事务改成了3,提交了,A事务再去读,依旧是2.提交的时候要进行数据版本比对,否则会有逻辑问题。

事务串行执行:事务一个一个执行,不会发生任何问题,但是执行效率低。

持久性  提交之后的数据要保存到硬盘,系统关了,下次启动还能读写。

分布式:多个系统,事务存在依赖关系,但是系统间网络不稳定。

问题:我当前事务执行到一半,调用其他系统,要等反馈才能决定接下来的逻辑,以及事务是否提交。

解决办法:事务最终一致性:拆分事务:记录当前事务状态到一张表,相关数据资源先占用,然后提交事务;定时去别的系统查结果,然后根据结果进行处理(成功就继续后续操作,失败就释放之前占用的数据资源)。

注:占用数据资源、释放数据资源要根据实际需求来判定,

比如:买东西,别人付款了,我就把库存先扣掉,记录到一个数据到等待支付结果确定的表里面,提交。别的事务可以基于扣除后的库存继续扣除啥的。然后定时器查询结果,如果支付成功,继续后续逻辑:通知物流系统、订单系统等,改下表状态,如果支付失败,就退回库存,改表状态。

分布式事务,系统间消息通讯是很重要的,不能丢失消息没处理,比如状态表的数据是绝对不能丢失的,否则库存资源一直占用,后续逻辑一直没处理。

分布式并发的情况下,可能导致系统处理不过来,既要处理用户订单支付,又要定时查表做后续处理。就需要定时任务处理服务,然后两个服务间需要mq做中间件,保证消息准确。

A服务发送事务状态数据到mq,然后mq路由消息到指定的B服务做处理(生产者消费者模式)生产者就是A服务,消费者是B服务,但是一个系统有很多业务流,所以会有很多生产者和很多消费者;这就有了各种模式。

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

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

相关文章

深浅拷贝及其现代写法

#include<iostream> using namespace std; class Person { public://默认构造Person(){cout << "Person()" << endl;}//有参构造函数Person(int age,int height){m_age age;m_height new int(height);cout << "Person(int age, int h…

centos7搭建maven私服nexus

1.nexus Nexus Repository Manager&#xff08;通常简称 Nexus 或 Nexus RM&#xff09;是由Sonatype公司开发的一款开源的、强大的软件仓库管理工具&#xff0c;主要用于企业级的二进制组件&#xff08;如Java库、Node.js模块、Python包等&#xff09;存储、管理和分发。 官方…

DRF学习之三大认证

一、认证 1、自定义认证 在前面说的 APIView 中封装了三大认证&#xff0c;分别为认证、权限、频率。认证即登录认证&#xff0c;权限表示该用户是否有权限访问接口&#xff0c;频率表示用户指定时间内能访问接口的次数。整个请求最开始的也是认证。 &#xff08;1&#xff…

Unity射击游戏开发教程:(3)如何销毁游戏对象 ,添加CD

在 Unity 中销毁游戏对象 在我之前的文章中,我写了关于实例化或创建激光预制体,当发射时,激光预制件将继续在屏幕上移动一段时间。 创建所有这些激光预制件后,最终会减慢游戏速度,因此我们必须通过创建激光预制件来找到平衡,在屏幕上移动直到它超出游戏视图,然后销毁它…

【RAG 论文】Adaptive-RAG:自适应地根据 query 难度来选择合适的 RAG 模型

论文&#xff1a;Adaptive-RAG: Learning to Adapt Retrieval-Augmented Large Language Models through Question Complexity ⭐⭐⭐⭐ Code&#xff1a;github.com/starsuzi/Adaptive-RAG NAACL 2024&#xff0c;arXiv:2403.14403 文章目录 一、论文速读二、实现细节2.1 三种…

GitHub/R3D3项目环境配置踩坑记录

1、前言 项目链接地址&#xff1a;SysCV/r3d3 (github.com) 按照安装步骤容易出现的问题&#xff0c;environment.yaml文件中安装相关包&#xff0c;其中还有两个pip install githttps://github.com/..........这两个建议注释掉&#xff0c;后面再来安装这两个。 2、问题及解…

下载六佰之际暨 SDK+Plugin 升级

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 这几个版…

Qt图片等资源管理

Qt的图片等资源管理通常有两种方式 1&#xff0c;直接将图标和一些配置文件打包在可执行程序中 添加qrc文件&#xff0c;可使用qtcreator直接添加 右键选中工程 点击选择即可。 然后添加文件。我这个例子是添加了Image文件夹下的图片资源 使用的时候&#xff0c;可以在代码…

Oracle Analytics BIEE 操作方法(六)数据格式1:百分比

问题&#xff1a; 有如下公式&#xff0c;将数据显示为按行的百分比。此时数据显示只会有一位小数。想显示两位 解决方案 在分析中找到“高级”标签&#xff0c;将“分析XML”中内容复制出来 替换 将&#xff1a;minDigits“1” maxDigits“1” 替换为&#xff1a;minDigits…

在线HTML编辑器源码

在线HTML编辑器源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 index.html <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>在线HTML编辑器</title><meta name"viewport" content"…

10年交易Anzo Capital昂首资本才发现的适合孕线的止损

拥有10年交易经验的投资者才发现的一种止损方法&#xff0c;那就是Inside-bar孕线止损&#xff0c;有些投资者就有疑问了&#xff0c;止损能明白&#xff0c;但是什么是Inside-bar孕线?其实很简单&#xff0c;Anzo Capital昂首资本就先做个知识普及&#xff1a; inside-bar就…

一文读懂VR数字展览会,从沉浸式体验到市场竞争力的全方位提升

在数字化转型的浪潮中&#xff0c;VR技术正逐渐成为商业展览的新趋势。VR数字展览会通过创新的展示功能和互动体验&#xff0c;为参展商和观众带来前所未有的便利和效果。 一、VR展示功能的沉浸式体验 1、全方位沉浸式体验&#xff1a; VR技术能够创造一个全方位的三维展览环…

备考2024年上海初中生古诗文大会:单选题真题示例和独家解析

上海市中小学生的初中生古诗文大会——即上海中学生古诗文大会&#xff08;初中组&#xff09;和小学生古诗文大会&#xff08;比赛&#xff09;相比&#xff0c;除了题型更丰富之外&#xff0c;最主要的是考察的内容深度和广度不同。初中的题目中对于文言文的考察大幅增加&…

vue3+node.js+mysql+ant design实现表格的查询功能

今日主要分享如何运用vue、nodejs、mysql及ant design构建表格数据查询功能&#xff0c;这也是众多项目开发者关注的问题。最关键在于前端与后端的协作&#xff0c;后端数据则通过nodejs编写。尽管涉及多项技术&#xff0c;看似复杂&#xff0c;但实际操作却并非困难。当然&…

【Harmony3.1/4.0】笔记六-对话框

概念 对话框在任何一款应用中&#xff0c;任何一个系统或者平台上使用都非常频繁&#xff0c;这里介绍一下鸿蒙系统中对话框的用法&#xff0c;分别为:普通文本对话框&#xff0c;自定义提示对话框&#xff0c;对话框菜单&#xff0c;警告提示对话框&#xff0c;列表选择对话框…

数据链路层(计算机网络,待完善)

0、前言 本文大多数图片都来自于 B站UP主&#xff1a;湖科大教书匠 的教学视频&#xff0c;对高军老师及其团队制作出这么优质的课程表示感谢。文章增加了部分个人理解&#xff0c;内容并不是对视频的静态化翻译。 1、概述 1.1、数据链路层在计算机网络体系中的位置 1.2、对…

第58篇:创建Nios II工程之Hello_World<四>

Q&#xff1a;最后我们在DE2-115开发板上演示运行Hello_World程序。 A&#xff1a;先烧录编译Quartus硬件工程时生成的.sof文件&#xff0c;在FPGA上成功配置Nios II系统&#xff1b;然后在Nios II Eclipse窗口右键点击工程名hello_world&#xff0c;选择Run As-->Nios II …

离线语音模块初步学习——LSYT201B(深圳雷龙发展)

一 、产品简介 首先简单介绍下该离线语音模块&#xff0c;官方给出的介绍是&#xff1a;YT2228 是根据智能语音交互市场需求及思必驰算法的发展方向定义开发的 “芯片算法”人工智能人机语音交互解决方案&#xff0c;具有高性能、低功耗等特点。该芯片通过软硬融合的方法&…

搭建web服务器需要哪些步骤?

首先跟大家简单普及一下什么是web服务器&#xff1f; Web服务器也称为WWW(WORLD WIDE WEB)服务器&#xff0c;一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序。WEB服务器主要功能是提供网上信息浏览服务&#xff0c;可以处理浏览器等Web客户端的请求并返…

婴儿洗衣机有必要买吗?四款好评婴儿洗衣机性能大对比

由于宝宝的日常衣物是经常需要换洗的&#xff0c;而且有时候一天好几套衣服&#xff0c;遇上尿湿了、吐奶了&#xff0c;换洗就更勤。每次一点点衣物就放进家庭用的大容积洗衣机清洗&#xff0c;会相对的比较容易耗水耗电。而如果把宝宝的换洗衣物堆积一阵子&#xff0c;汇总了…
最新文章