多线程
文章平均质量分 79
it噩梦
好记性不如烂笔头
展开
-
AQS总结
文章目录概述主要用到 AQS 的并发工具类ReentrantLock 原理非公平锁实现原理公平锁加锁过程条件变量实现原理概述全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架。特点:用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁getState - 获取 state 状态setState - 设置 state 状态compareAndSetState - cas 机制设置 .原创 2022-03-03 17:35:10 · 469 阅读 · 0 评论 -
synchronized 总结
文章目录Monitor 原理synchronized 原理Monitor 原理每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的Mark Word 中就被设置指向 Monitor 对象的指针。Monitor 结构如下:刚开始 Monitor 中 Owner 为 null当 Thread-2 执行 synchronized(obj) 就会将 Monitor 的所有者 Owner 置为 Thread-2,Monito.原创 2022-02-26 22:20:51 · 805 阅读 · 0 评论 -
java 线程池相关整理
原创 2021-12-08 22:30:00 · 110 阅读 · 0 评论 -
JAVA Metrics 进阶
文章目录Metrics Pluginsdead lock health check自定义health checkMetrics PluginsMetrics 之所以受欢迎,除了提供了一套度量指标的标准外,其源代码层次分明、可扩展性强也是一个非常重要的因素。再Github上相关的开源项目也很多,介绍两款插件。dead lock health check <dependency> <groupId>io.dropwizard.metrics<.原创 2021-12-03 11:06:02 · 964 阅读 · 0 评论 -
通过JMH测试公平锁与非公平锁
@BenchmarkMode(Mode.AverageTime)@OutputTimeUnit(TimeUnit.MICROSECONDS)@Measurement(iterations = 10)@Warmup(iterations = 5)@State(Scope.Group)public class FairAndUnfairTest { @Param({"1", "2"}) private int type; private static Lock lock;.原创 2021-11-30 21:10:39 · 273 阅读 · 3 评论 -
JMH高级用法
前言虽然JMH可以帮我们更好了解我们所编写的代码,但是如果我们所编写的JMH基准测试本身就有问题,那就很难起到指导作用。编写正确的微基准测试用例现代的Java虚拟机越来越智能,它在类的早期编译阶段、加载阶段以及后期的运行时都可以为我们的代码进行相关的优化,比如Dead Code的擦除、常量的折叠、循环的打开,甚至是profile的优化。避免DCE(Dead Code Elimination)所谓dead code 是指JVM为我们擦去了上下文无关的代码,甚至经过计算后不会用到的代码。@Benc.原创 2021-11-29 22:00:00 · 401 阅读 · 0 评论 -
JMH快速入门
JMH简介JMH是专门用于代码微基准测试的工具集。JMH是由实现Java虚拟机的团队开发的,由于现在JVM已经变得越来越智能,在Java文件的编译阶段、类的加载阶段,以及运行阶段可能进行了不同程度的优化,因此开发者...原创 2021-11-26 22:30:00 · 699 阅读 · 0 评论 -
StampLock
在 JDK 1.8 引入 StampedLock,可以理解为对 ReentrantReadWriteLock在某些方面的增强,在原先读写锁的基础上新增了一种叫乐观读(Optimistic Reading)的模式。原创 2021-11-15 13:52:07 · 377 阅读 · 0 评论 -
ThreadLocal父子线程传递的坑
文章目录前言InheritableThreadLocaltransmittable-thread-local总结前言如果子线程想要拿到父线程的中的ThreadLocal值怎么办呢?看下下面代码public class ThreadLocalParentChild { public static void main(String[] args) { final ThreadLocal threadLocal = new ThreadLocal() { .原创 2020-07-03 09:31:37 · 1156 阅读 · 0 评论 -
简析线程上下文ThreadLocal
文章目录前言ThreadLocal 简单介绍ThreadLocal常用方法介绍initialValuesetget看看ThreadLocalMap看个例子前言在有些时候,单个线程执行任务非常多的时候,后一个步输入是前一个步骤的输出,我们有时候会采用责任链模式,但是调用链路长了以后,这种传参方式会显得冗余,于是就有了线程上下文的设计,每个线程会有不同的参数实例。原因是每个线程Thread.currentThread()作为key,这样就可以保证线程的独立性。需要注意的是,我们会一般用Map存储,.原创 2020-07-01 13:53:39 · 737 阅读 · 1 评论 -
简单介绍七种单例模式
前言原创 2020-06-30 15:38:48 · 1256 阅读 · 1 评论 -
又被问到代码执行顺序?来看看init和clinit吧
前言之前面试的时候经常会被问到,代码的执行顺序,偶尔一次蒙对了,还会继续被怼能解释下为什么么?下面就看看这到底怎么解init和clinit区别init是对象构造器方法,也就是说在程序执行 new 一个对象调用该对象类的 constructor 方法时才会执行init方法,而clinit是类构造器方法,也就是在jvm进行类加载—–验证—-解析—–初始化,中的初始化阶段jvm会调用clinit方法。init是instance实例构造器,对非静态变量解析初始化,而clinit是class类构造器对.原创 2020-06-29 18:35:43 · 465 阅读 · 0 评论 -
线程上下文类加载器
前言看本文之前,推荐一篇博客:Class.forName 和 ClassLoader 到底有啥区别?。为什么要有线程上下文类加载器根绝Thread类的文档你会发现线程上下文方法是JDK1.2开始引入的,setContextClassLoader()和setContextClassLoader()分别用于获取设置当前线程上下文类加载器,如果当前线程没有设置上下文类加载器,那么它将和父线程保持同样的类加载器。为什么要有线程上下文类加载器呢?这就与JVM类加载器双亲委托机制自身的缺陷是分不开的,JDK.原创 2020-06-27 17:06:14 · 760 阅读 · 0 评论 -
破环双亲委托机制
前言在之前我们给出的方案都是绕过应用加载器的方式,并没有避免一层一层的委托,那么有没有什么办法可以绕过这种双亲委托模型呢?很庆幸,JDK提供的双亲委托机制并非是一个强制的模型,程序员可以对其进行灵活的发挥破环这种委托机制的,比如说热部署,其实就是不停止服务的情况下,更新JVM中的代码。具体实现以下是具体的实现,继承上篇文章中的MyClassLoader,重写loadClass方法。public class BrokerDelegateClassLoader extends MyClassload.原创 2020-06-27 10:03:08 · 525 阅读 · 0 评论 -
线程池原理及自定义线程池
文章目录线程池原理线程池接口定义ThreadPoolRunnableQueueThreadPoolFactoryDenyPolicyInternalTask线程池自定义详细实现LinkedRunnableQueue初始化任务线程池BasicThreadPoolThreadPoolTest线程池原理所谓线程池,通俗的讲就是有一个池子,里面存放着已经创建好的线程,当有任务提交到池子中时,池子中的某个线程会自动执行任务,如果池子中的线程数量不够,则会创建更多的线程来完成任务,但是该数量是有限的。但是该数量.原创 2020-06-23 19:57:12 · 560 阅读 · 0 评论 -
读写锁分离设计模式
文章目录读写锁分离设计模式LockReadWriteLockReadWriteLockImplReadLockWriteLock读写锁的使用ShareData, 对读写锁的进行线程控制总结读写锁分离设计模式对资源的访问一般包括两种动作–读和写,多线程同一时刻对资源读操作,虽然有资源竞争,但是这种竞争不足以引起数据不一致,那么这个时候直接采用排他锁的方式,就显得有些粗暴了。如果对某个资源读的操作多于写的操作,那么多线程读时并不需要加锁,很明显对程序性能的提升有很大的帮助,于是想搞一个读写锁的简单实现.原创 2020-06-22 19:56:25 · 188 阅读 · 2 评论 -
并发编程简单总结
单核CPU可以多线程么?即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。为什么并发.原创 2020-05-16 10:35:22 · 226 阅读 · 0 评论 -
【JUC专题】探险乐观锁与悲观锁的区别
TODO原创 2019-12-04 09:43:16 · 174 阅读 · 0 评论 -
【JUC专题】scheduleAtFixedRate与scheduleWithFixedDelay区别
TODO参考blog https://www.jianshu.com/p/ca78c2a1c108原创 2019-12-02 21:04:18 · 136 阅读 · 0 评论