并发编程
文章平均质量分 88
fenglllle
这个作者很懒,什么都没留下…
展开
-
logback异步日志打印阻塞工作线程
实际上这个问题是使用问题,非常简单,不过越是简单的使用,却可能出现致命问题,一般公司都会统一脚手架或者统一规范的方式来实现标准的日志配置文件,防止错误配置导致业务问题,不知道未来Java虚拟线程大规模使用会不会缓解日志打印阻塞工作线程的问题,毕竟调度更优,不过如果线程池满载,虚拟线程也是无能为力。还是需要在丢日志和存储消费日志的能力作取舍。原创 2023-11-12 16:59:23 · 2405 阅读 · 0 评论 -
goreplay 录制回放源码解析
goreplay 录制回放源码解析前言流量录制流量回放数据模拟goreplay的源码分析goreplay demo构造goreplay源码分析启动分析运行时监听前言一般而言流量的录制与回放经常在测试过程中使用,自动化批量验证功能,或者用来做ABTest实验。流量在互联网公司就是数据,是用户,因而很多互联网公司就是流量公司,就是风口,本质上讲大数据分析就是分析流量,比如:杀熟。流量的回放仅仅是流量的一种用途,流量的录制是基础,只有录制好流量,可以有很多用途。流量录制流量的录制实际上有很多种方式,常见的原创 2022-05-07 11:33:35 · 1445 阅读 · 0 评论 -
jmeter入门使用
前言压力测试是比较常见的验证接口性能的方式,一般有很多压测工具,其中jmeter是比较实用的开源工具,使用Java语言编写,支持跨平台。实际上压测就是控制变量法,只能在特殊条件下的理想结果,实际运行是有一定差异的,只能作为参考。1. JDK配置JDK使用Oracle JDK,openjdk都可以,配置好JAVA_HOME,JDK尽量选择LTS版本,即8,11,17,目前推荐JDK11,优选openjdk。以macos为例,Linux同理,笔者做过jmeter测试OpenJDK与Oracle JD原创 2022-05-05 18:38:44 · 1200 阅读 · 0 评论 -
Tomcat线程居高不下的原因
前言笔者在解决业务的问题中发现,如果Tomcat在并发延迟突变高后,很容易线程数量飙高,而且短时间是降不下去的,除非重启,但是不能线程飙高就重启吧,实际上是线程池的逻辑,然而Tomcat开放的配置是限制的。1. Tomcat运行的线程配置Tomcat运行过程一般都是在server.xml中配置catalina-exec-xxx和http-nio-8080-xxx另外的配置2. Tomcat线程飙高很久的原因线程池的线程数量要超过core数量必须要正在执行的任务线.原创 2022-01-24 22:30:21 · 3466 阅读 · 0 评论 -
Java结束线程
前言 最近年底,项目紧很少写博客了,现在说说最近碰到的问题,笔者在做分布式JOB系统的时候,遇到一个比较棘手的问题:停止正在运行的线程。1. 线程的生命周期线程停止即Terminated状态是伴随run方法的结束而生,也就是run完成后由Thread类来决定线程停止了,销毁资源释放空间。关于线程可以看我的另一篇文章:线程的实现,调度和生命周期,纯粹理论。2. 手...原创 2019-12-02 21:41:41 · 358 阅读 · 0 评论 -
InheritableThreadLocal父线程传递子线程线程安全
前言 最近做项目,需要全链路跟踪,有各种比较成熟的方案,MDC/NDC log方式;zipkin之类的框架。究其根源是ThreadLocal与InheritableThreadLocal。下面看看两者的区别。1. threadLocal demopublic class ThreadLocalDemo { static ThreadLocal<String...原创 2019-10-05 17:55:48 · 1244 阅读 · 4 评论 -
JDK8线程池-ThreadPoolExecutor动态调整corePoolSize与maximumPoolSize
前言线程池ThreadPoolExecutor在运行的过程中,业务并发量变动,需要不停服务调整线程池的线程数,ThreadPoolExecutor支持动态调整corePoolSize与maximumPoolSize的值。1. 示例demopublic class ThreadChangeTest { public static void main(String[] args)...原创 2018-11-25 10:28:42 · 10767 阅读 · 7 评论 -
JDK8线程池-Executors-ThreadPoolExecutor用法
前言Executors工具类的用法与缺陷1. 固定线程的线程池 ExecutorService ex1 = Executors.newFixedThreadPool(5); for (int i=0;i<10;i++){ ex1.execute(()-> System.out.println(Thread.currentThread().ge...原创 2018-10-28 21:28:08 · 2973 阅读 · 0 评论 -
JDK8线程池-ThreadPoolExecutor执行结果FutureTask源码分析与优化
前言 上一章讲述了线程池ThreadPoolExecutor的原理。在线程池的运算过程结束后可以有返回值1. ExecutorService 示例public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(6);...原创 2018-10-12 21:25:06 · 1699 阅读 · 0 评论 -
线程的实现,调度和生命周期
前言经常在面试的时候问到Java的线程生命周期,虽然实际运用中不会关注这些。但了解Java线程的实现,调度和生命周期,对编程就会豁然开朗。1. 线程的实现线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源和执行调度分开,各个线程既可以共享进程资源(内存地址、文件IO等),又可以独立调度,线程是CPU调度的基本单位。1.1 内核线程实现直接由操作内核支持的线程,...原创 2018-10-15 22:05:02 · 2981 阅读 · 0 评论 -
LockSupport park和unpark
前言在上一篇文章线程池返回值Future中,源码分析线程池结果获取阻塞的原因。LockSupport.unpark(t);LockSupport.parkNanos(this, nanos);或者LockSupport.park(this);使用unpark唤醒线程,使用park阻塞线程,下面介绍他们的作用以及与wait和notify或者notifyAll的区别。1. Lock...原创 2018-10-14 21:03:38 · 3946 阅读 · 1 评论 -
JDK8 CopyOnWrite容器(COW)
前言CopyOnWrite,写复制容器,一种延时懒惰策略。JDK5开始提供了两个写复制容器CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite即写复制容器。体现读写分离的思想,即add或者set元素的时候,copy一个容器用于写,以前的容器仍然可以读取,当添加完成元素之后,将复制的容器作为新的容器,废弃以前的容器GC掉。1. Co...原创 2018-08-28 11:04:21 · 349 阅读 · 0 评论 -
AtomicInteger原理分析
前言AtomicInteger的本质:自旋锁+CAS原子操作 1. 源码分析public class AtomicInteger extends Number implements java.io.Serializable { private static final long serialVersionUID = 6214790243416807050L; /...原创 2018-08-02 17:52:53 · 6155 阅读 · 0 评论 -
java volatile详解
volatile常用于配合CAS和version实现锁机制,乐观锁。适用于读多写少模式。1. volatile涉及与CPU与内存模型,线程的工作原理,网上找了一个经典图 CPU在轮询执行线程运算的时候,由于CPU的结构 CPU与内存交付有3级缓存机制,会导致缓存不一致性。CPU的缓存越靠近CPU内核core,速度越快 ,容量越小。 多核CPU对线程工作副本,多个线程...原创 2018-07-31 17:56:29 · 1347 阅读 · 0 评论 -
synchronized的原理及其使用说明
首先synchronized是阻塞式锁,悲观锁,会造成线程的挂起和恢复操作。JVM JDK1.2以后的线程模型是用户态和内核态共同存在,存在切换开销。先看段代码public class Test2 { public synchronized void test() { System.out.println("hello"); } publ...原创 2018-07-31 09:50:24 · 286 阅读 · 0 评论 -
ThreadLocal原理分析与内存泄漏的原因
前言:ThreadLocal的原理是每个线程保存ThreadLocal.ThreadLocalMap。实现线程独享变量副本保证线程安全。1. Thread源码分析,ThreadLocal.ThreadLocalMap是Thread的成员变量publicclass Thread implements Runnable { /* ThreadLocal values perta...原创 2018-07-20 15:16:00 · 1055 阅读 · 2 评论 -
JDK8线程池-ThreadPoolExecutor参数
前言我们使用线程池工具类,常用的newFixedThreadPool方法就是使用的ThreadPoolExecutor public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, ...原创 2018-07-20 11:38:33 · 1261 阅读 · 0 评论