Java并发编程
文章平均质量分 79
Java并发编程
TPBoreas
我就随便写写
展开
-
经典面试题 | 单核CPU支持Java多线程吗?
先悉知几个概念1、相应时间(Response Time)第一次发出请求到收到系统完整响应数据所需的时间,相应时间是反应系统性能的总要指标,直接反应了系统响应的快慢2、吞吐量(Throughput)单位时间内系统所处理的用户请求,F = VU * R / TF = 吞吐量,VU = 虚拟用户个数,R = 每个虚拟用户发出的请求数,T = 性能测试所用的时间3、每秒请求数(QPS)服务器在一秒内处理了多少个请求,主要用来表示“读”请求4、每秒事务数(TPS)服务器每秒处理的事务数。原创 2024-05-01 06:59:37 · 830 阅读 · 0 评论 -
Jvm调优神器 | Arthas
我们做项目实战中使用jdk自带的小工具,比如jps、jmap、jstack等,用这些自带的小工具排查问题的最大的痛点就是比较麻烦,就比如排除cpu占用率过高的问题,就要top -> jps -> printf -> jstack等一系列操作,本篇介绍了一款阿里巴巴开源工具 -- arthas (阿尔卑斯)本篇介绍第一种方式,因为它简单而且想迁移的时候也超级方便(毕竟只需要把下载的jar包拷贝走就行了)如果下载速度太慢,可以用gitee上的源curl命令直接把arthas-boot.jar下载到你想要的目录。原创 2024-04-25 06:56:07 · 908 阅读 · 0 评论 -
如何利用CompletableFuture解决并行查询问题?
所以这样一来,我们就利用 CountDownLatch 实现了这个需求,也就是说我们最多等 3 秒钟,但如果在 3 秒之内全都返回了,我们也可以快速地去返回,不会傻等,提高了效率。在本课时中,我们先给出了一个旅游平台问题,它需要获取各航空公司的机票信息,随后进行了代码演进,从串行到并行,再到有超时的并行,最后到不仅有超时的并行,而且如果大家速度都很快,那么也不需要一直等到超时时间到,我们进行了这样的一步一步的迭代。当每一个请求发出去之后,等它响应回来以后,我们才能去请求下一个网站,这就是串行的方式。转载 2024-04-14 11:08:37 · 209 阅读 · 1 评论 -
数据库的多事务并发运行的隔离机制
今天给大家简单梳理一下MySQL中的多事务并发运行的隔离原理,其实这套隔离原理,说白了就是MVCC机制,也就是multi-version concurrent control,就是多版本并发控制机制,专门控制多个事务并发运行的时候,互相之间会如何影响。然后MySQL实现MVCC机制的时候,是基于undo log多版本链条+ReadView机制来做的,默认的RR隔离级别,就是基于这套机制来实现的,依托这套机制实现了RR级别,除了避免脏写、脏读、不可重复读,还能避免幻读问题。转载 2024-04-14 11:19:59 · 49 阅读 · 1 评论 -
简单易懂的方式讲述并发、线程
并发编程和性能优化是密切相关的,可以加快用户的响应时间,把一大部分的代码放到线程中运行,把代码模块化处理,异步化的手段,如高并发读、高并发写去提升程序的性能。线程在执行的时候,占用资源的。并发编程里面,要用的future,拿结果,future是个接口,不能实力化的,实现了一个所谓的FutureTask.get(),可以拿到callable的结果。当你的进程在CPU上跑的时候,缓存,CPU本身自带的数据,一个线程在CPU上跑的时候,缓存,寄存器,程序计数器等,CPU内部存放的数据,线程数据。原创 2024-04-04 17:50:02 · 1061 阅读 · 1 评论 -
实现多线程有哪几种方式?为什么说本质上只有一种实现线程的方式?
创建线程只有一种方式,那就是构造一个Thread类;唯一的原因:Thread是继承了Runnable接口进行实现得,单独运行一个继承了Runnable的类是无意义的,因为它需要当前线程支撑,Thread是支撑Runnable真正运行的基础,而Runnable作为函数式接口定义了Thread运行时内容的规范,所以严格意义上来说,Runnable不能说明为是实现线程的一种方式,而是实现自定义线程(线程需单独指定,可以是当前工作线程,也可以是继承了Thread的自定义线程)运行内容的一种方式。转载 2024-04-12 17:04:32 · 47 阅读 · 1 评论 -
为什么线程之间需要协作?线程怎么协作?
1、为什么线程之间需要协作线程之间相互配合,完成某项工作,比如:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程。前者是生产者,后者就是消费者,这种模式隔离了“做什么”(What)和“怎么做”(How)。简单的办法是让消费者线程不断地循环检查变量是否符合预期,在while循环中设置不满足的条件,如果条件满足则退出while循环,从而完成消费者的工作。这样进行线程之间的协作却存在如下2个问题:(1)难以确保及时性。转载 2024-04-14 11:35:46 · 44 阅读 · 1 评论 -
面试高频问题 | 线程池
带缓冲线程池,从构造看核心线程数为0,最大线程数为Integer最大值大小,超过0个的空闲线程在60秒后销毁,SynchronousQueue这是一个直接提交的队列,意味着每个新任务都会有线程来执行,如果线程池有可用线程则执行任务,没有的话就创建一个来执行,线程池中的线程数不确定,一般建议执行速度较快较小的线程,不然这个最大线程池边界过大容易造成内存溢出。很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用。原创 2024-04-21 16:29:03 · 1401 阅读 · 0 评论 -
项目实战 | 如何监控Java线程池
线程池提交了 100000 个任务,但同时只有 50 个线程在执行工作,我们每陋 3 秒来获取当前线程池的运行状态。活动线程数和总线程数是不变的,排队中的线程数和执行完成的线程数不断在变化,直到所有任务执行完毕。能实时获取线程池的当前活动线程数、正在排队中的任务数、已经执行完成的线程数、总任务数等。总任务数 = 排队任务数 + 活动线程数 + 执行完成的线程数。下面给出一个线程池使用示例,及教你获取线程池状态。原创 2024-04-21 16:47:48 · 478 阅读 · 0 评论