线程学习总结
文章平均质量分 92
吒哇
这个作者很懒,什么都没留下…
展开
-
网络IO模型核心原理介绍
1 socket四元组与其对应的文件描述符的关系介绍客户端和服务器建立连接是在各自的内核中完成的,建立连接之后产生的socket四元组也分别保存在各自的内核中,并且客户端和服务器都会将socket四元组映射成一个文件描述符供用户空间使用。下面是简图图1 socket四元组与其对应的文件描述符关系图2 BIO模型存在的问题:如果连接上来的客户端一直不发送数据,就阻塞了,那么后面新的客户端的连接就得不到处理。退一步,即便是连接上来的客户端发送了数据,但是对数据的处理逻辑复杂,...原创 2021-09-15 14:28:54 · 307 阅读 · 0 评论 -
强哥讲讲volatile保证内存可见性
1 引言volatile关键字想必大家并不陌生,我们在进行多线程编程开发时经常遇到。使用volatile的一个关键目的是为了保证内存中共享变量的可见性。下文会从cpu指令和JMM内存模型角度探究,volatile是如何保证内存可见性的。2 CPU存储器层次结构简介我们大家都知道,cpu的运行速度是非常之快的,假如,cpu直接从硬盘读取和操作数据,会怎么样呢?那大家肯定会崩溃。因为,硬盘的运行速度是非常慢的相对于cpu来说。为了使cpu大量的时间用来计算而不是等待读取,出现了内存。但是随着...原创 2021-09-15 14:08:21 · 675 阅读 · 0 评论 -
公司报表配置系统总结
1.第一步:执行sql前的参数处理,其目的就是转换查询参数,拼接sql,最终拼接成sql:select * from user where name=? and age=? 这种形式,具体处理的思想是借鉴了mybatis的设计思想,用mybati的标签处理来设计的其中用到了org.apache.ibatis.scripting.xmltags.ExpressionEvaluator来验证mybaits中的标签if语句是否成立,比如:<if page_name!='全部页面'.原创 2020-08-27 15:12:01 · 317 阅读 · 0 评论 -
LockSupport(park/unpark)源码分析
关于LockSupportconcurrent包的基础Doug Lea 的神作concurrent包是基于AQS (AbstractQueuedSynchronizer)框架,AQS框架借助于两个类:Unsafe(提供CAS操作)和LockSupport(提供park/unpark操作)。因此,LockSupport可谓构建concurrent包的基础之一。理解concurrent包,就从这里开始。两个重点操作对象归根结底,LockSupport调用的Unsafe中的native代码:..原创 2020-06-28 17:27:02 · 256 阅读 · 0 评论 -
Volatile关键字解读
原创 2020-06-26 16:27:42 · 145 阅读 · 0 评论 -
彻底搞懂synchronized(从偏向锁到重量级锁)
参考链接:https://blog.csdn.net/weixin_37948888/article/details/102545049原创 2020-06-25 15:31:44 · 255 阅读 · 0 评论 -
线程池是如何保证核心线程不死亡,核心线程和非核心线程的区别?
线程池里的线程从阻塞队列里拿任务,如果存在非核心线程,假设阻塞队列里没有任务,那么非核心线程也要在等到keepAliveTime时间后才会释放。如果当前仅有核心线程存在,如果允许释放核心线程的话,也就和非核线程的处理方式一样,反之,则通过take一直阻塞直到拿到任务,这也就是线程池里的核心线程为什么不死的原因。线程池不区分核心线程和非核心线程,线程池是期望达到corePoolSize的并发状态,并允许在不得已情况下超载,达到corePoolSize ~ maximumPoolSize 的并发状态参考原创 2020-06-24 14:46:14 · 5132 阅读 · 2 评论 -
Java 线程池中的线程复用是如何实现的?
关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建?那么就来和大家探讨下这个问题,在线程池中,线程会从 workQueue 中读取任务来执行,最小的执行单位就是 Worker,Worker 实现了 Runnable 接口,重写了 run 方法,这个 run 方法是让每个线程去执行一个循环,在这个循环代码中,去判断是否有任务待执行,若有则直接去执行这个任务,因此线程数不会增加。如下是线程池创建线程的整体流程图:首先会判断线程池的状原创 2020-06-23 10:52:31 · 1209 阅读 · 0 评论 -
Java 线程池中worker(线程池是复用线程的)
Java 线程池中worker在java线程中,真正执行计算操作的内容是在一个worker类中。Worker的主要代码: private final class Worker extends AbstractQueuedSynchronizer implements Runnable { /** * This class will never be serialized, but we provide a.原创 2020-06-23 10:41:08 · 1880 阅读 · 0 评论 -
JDK1.8源码分析之ThreadPoolExecutor
参见:https://www.cnblogs.com/leesf456/p/5585627.html原创 2020-06-05 14:40:13 · 120 阅读 · 0 评论 -
线上服务器oom排查总结
1.oom情况出现java.lang.OutOfMemoryError: GC overhead limit exceeded 一般是(某个循环里可能性最大)在不停的分配对象,但是分配的太多,把堆撑爆了。出现java.lang.OutOfMemoryError: Java heap space一般是分配了巨型对象下面就是出现GC overhead limit exceeded 的实际情...原创 2019-12-20 14:48:25 · 1854 阅读 · 0 评论 -
后端服务故障排查 -- dubbo服务超时、线程池耗尽 CPU高负载
文章目录问题现象 dubbo线程池耗尽的异常日志 cpu占用情况 问题排查 dubbo线程池耗尽排查 cpu 高负载排查 排查相关命令 排查 初步定位问题场景 验证,确认问题点 原因分析 调整后验证 其他执行的一些优化点 参考资料 问题现象5-6 到 5-7,某测试环境我们的服务时常收到调用方反馈,d...原创 2019-12-20 14:23:08 · 2677 阅读 · 0 评论 -
Java中CAS原理详解
一、什么是CASCAS,compare and swap的缩写,中文翻译成比较并交换CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该 位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前...原创 2019-08-15 15:33:37 · 269 阅读 · 0 评论 -
平均负载及CPU上下文切换
结论每秒上下文切换次数的大小,取决于CPU性能,一般来说,切换稳定,数值从百到万以内,都算正常:cswch/s 切换多,说明进程在等待资源,可能发生了I/O等其他问题nvcswch/sq 切换多,说明进程被强制调度,也就是争抢CPU,说明CPU有瓶颈中断次数多了,说明CPU被中断程序占用,具体可以分析 /proc/interrupts文件vmstat 用来查看虚拟内存,也可以查看一些CP...原创 2019-07-26 17:10:35 · 389 阅读 · 0 评论 -
Java多线程(最新总结)
实现多线程的三种方法 继承Thread类,重写父类run()方法 publicclassthread1extendsThread{publicvoidrun(){for(inti=0;i<10000;i++){System.out.println("我是...原创 2019-07-26 15:25:15 · 330 阅读 · 0 评论 -
Java并发——线程间通信
线程间通信线程之间除了同步互斥,还要考虑通信。在Java5之前我们的通信方式为:wait 和 notify。Condition的优势是支持多路等待,即可以定义多个Condition,每个condition控制线程的一条执行通路。传统方式只能是一路等待1.Condition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wai...原创 2019-07-30 17:01:11 · 300 阅读 · 0 评论 -
显式锁和AQS
ReentrantLock和Synchronized的异同点:总结实现锁的关键在于:通过CAS操作与volatile变量互相配合,线程安全的修改锁标志位 基于CLH队列,实现锁的排队策略,对于公平锁,当前线程只需要监控他的前驱节点的锁情况,当前锁持有这肯定是头节点个人理解记录ReentrantLock基于aqs实现,他的基本原理是aqs的status为0时表示锁被占用,为1...原创 2019-07-29 16:23:42 · 25831 阅读 · 0 评论 -
线程的并发工具类
常用的并发工具类CountDownLatch作用:是一组线程等待其他的线程完成工作以后在执行,加强版joinawait用来等待,countDown负责计数器的减一CyclicBarrier让一组线程达到某个屏障,被阻塞,一直到组内最后一个线程达到屏障时,屏障开放,所有被阻塞的线程会继续运行CyclicBarrier(int parties)CyclicBarrier(int...原创 2019-07-29 15:32:36 · 388 阅读 · 0 评论 -
线程之间通信
一:获取对象锁机制public class MyObject { synchronized public void methodA() { //do something.... } synchronized public void methodB() { //do some other thing }}public cl...原创 2019-03-18 15:49:06 · 335 阅读 · 0 评论