Java多线程
文章平均质量分 96
Java多线程技术详解(JUC并发包工具类)
邋遢的流浪剑客
成长中的基础架构攻城狮
展开
-
Disruptor核心原理、源码解析
前言前两篇Disruptor学习笔记:基本使用、核心概念和原理和Netty整合Disruptor实战文章中,主要讲解了Disruptor的一些API的使用、概念等,本文会进一步来解析Disruptor的核心原理和相关源码1、Disruptor的性能为什么这么高?内存分配更加合理,使用RingBuffer数据结构,数组元素在初始化时一次性全部创建,提升缓存命中率;对象循环利用,避免频繁GC能够避免伪共享,提升缓存利用率采用无锁算法,避免频繁加锁、解锁的性能消耗(CAS操作代替锁)支持批量消费,消原创 2021-10-10 17:24:34 · 2634 阅读 · 0 评论 -
Disruptor学习笔记:基本使用、核心概念和原理
Disruptor是英国外汇交易公司LMAX开发的一个高性能队列(系统内部的内存队列),研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖1、快速入门1)、步骤创建一个工厂Event类,用于创建Event类实例对象需要有一个监听事件类,用于处原创 2021-09-20 09:29:48 · 1652 阅读 · 0 评论 -
TransmittableThreadLocal详解
ThreadLocal和InheritableThreadLocal学习资料:二刷Java多线程:ThreadLocal详解线程池学习资料:二刷Java多线程:线程池详解1、InheritableThreadLocal+线程池局限性InheritableThreadLocal支持子线程访问在父线程中设置的线程上下文环境,其实现原理是在创建子线程时将父线程中的本地变量值复制到子线程,即复制的时机为创建子线程时当提交一个新任务到线程池时,线程池的处理流程如下:线程池判断线程数是否达到核心线程数且线程原创 2021-03-27 21:52:07 · 1995 阅读 · 2 评论 -
重新解读JMM与volatile
最近面试面的有些自闭,问得越来越深入了,所以决定重新读一下《Java并发编程的艺术》,同时结合一些其他的文章,来深入地解读一下JMM与volatile一、现代计算机的内存模型其实早期计算机中CPU和内存的速度是差不多的,但在现代计算机中,CPU的指令速度远超内存的存取速度,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲将运算需要使用到的数据复制到缓存中,让运算能快速进.原创 2020-09-13 09:17:21 · 725 阅读 · 0 评论 -
JVM与多线程知识点补充
一、垃圾收集器相关1、HotSpot的算法细节实现其实下面讲到的技术本质上是为了解决垃圾回收过程中的具体问题而采用的解决方案,所以我会先说明遇到的问题再讲解HotSpot给出相对应的解决方案1)、OopMap在判断对象是否存活的时候,采用的是可达性分析算法,也就是从GC Roots集合找引用链这样的一个过程。虽然固定可以作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,但如果要逐个检查以这里为起源的引用要消耗不少的时间。而且为了保证分析结原创 2020-08-23 19:02:34 · 713 阅读 · 1 评论 -
并发工具类:Fork、Join和CompletionService
一、Fork/JoinFork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果工作窃取算法:假如我们需要做一个比较大的任务,可以把这个任务分割为若干互不依赖的子任务,为了减少线程间的竞争,把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应。比如A线程负责处理A队列里的任务。但是,有的线程会先把自己队列里的任务干完,而其他线程对应的队列里还有任务等待处理。干完活的线程与其等着,不如去帮其他线程原创 2020-07-24 08:25:09 · 602 阅读 · 0 评论 -
Java多线程复习(三):并发容器、线程池、ThreadLocal、伪共享
九、并发容器1、并发容器简介在Java1.5之前所谓的线程安全的容器,主要指的是同步容器。不过同步容器最大的问题就是性能差,所有方法都用synchronized来保证互斥,串行度太高了。因此Java在1.5及之后版本提供了性能更高的容器,一般称为并发容器并发容器关系图如下:2、List1)、CopyOnWriteArrayList简介List里面只有一个实现类CopyOnWriteA...原创 2019-12-28 21:35:15 · 932 阅读 · 2 评论 -
Java多线程复习(二):UnSafe与CAS、AQS与锁、CountDownLatch、CyclicBarrier、Semaphore
五、UnSafe与CAS1、UnSafeUnsafe类为单例实现,提供静态方法getUnsafe()获取Unsafe实例,当且仅当调用getUnsafe()方法的类为引导类加载器所加载时才合法,否则抛出SecurityException异常AtomicInteger内部使用UnSafe来实现的,源码如下:public class AtomicLong extends Number impl...原创 2019-12-28 15:38:28 · 870 阅读 · 1 评论 -
Java多线程复习(一):JMM、volatile、synchronized、happens-before
一、JMM(Java内存模型)在Java中,所有实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享。局部变量、方法定义参数和异常处理器参数不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响JMM本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段、静态字段和构成数组对象的元素)的访问方式Java线程之间的通信由...原创 2019-12-28 10:02:11 · 696 阅读 · 0 评论 -
Java多线程实战篇:单例模式与多线程
1、立即加载/饿汉模式// 立即加载/饿汉模式public class MyObject { private static final MyObject myObject = new MyObject(); private MyObject() { } public static MyObject getInstance() { return myObject; }}...原创 2019-02-05 17:35:15 · 554 阅读 · 0 评论 -
Java多线程实战篇:交叉打印
要求效果:先打印5次“printA…”,再打印5次“printB…”,每次打印间隔1秒,重复循环20次方式一:使用wait()和notifyAll()方法public class MyService { private volatile boolean flag = false; public synchronized void printA() { try { while (...原创 2019-02-05 17:41:54 · 1291 阅读 · 0 评论 -
Java多线程:并发编程的挑战+Java并发机制的底层实现原理
最近开始学习Java多线程相关的知识了,想要基础入门的话推荐读《Java多线程编程核心技术》,内容偏实战,想要深入理解多线程的话推荐读《Java并发编程的艺术》和《Java并发编程实战》,最近的话在看《Java并发编程的艺术》,看的同时做一下相关的记录一、并发编程的挑战1、上下文切换单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线...原创 2019-02-06 18:16:50 · 2519 阅读 · 2 评论 -
Java多线程:Java内存模型1
Java内存模型11、Java内存模型的基础1)、并发编程模型的两个关键问题在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间...原创 2019-02-09 11:49:00 · 613 阅读 · 0 评论 -
Java多线程:Java内存模型2
Java内存模型1:https://blog.csdn.net/qq_40378034/article/details/86800091Java内存模型26、final域的内存语义1)、final域的重排序规则对于final域,编译器和处理器要遵守两个重排序规则:1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序2)初次读...原创 2019-02-09 17:17:50 · 486 阅读 · 0 评论 -
Java多线程:Java并发编程基础
Java并发编程基础1、线程简介1)、什么是线程现代操作系统在运行一个程序时,会为其创建一个进程。现代操作系统调度的最小单位是线程,也叫轻量级进程,在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行2)、为什么要使用多线程更多的处理器核心更快的响应速度更好的编程模型...原创 2019-02-11 08:48:53 · 793 阅读 · 0 评论 -
Java多线程:Java中的13个原子操作类+Java中的并发工具类
一、Java中的13个原子操作类Java从JDK1.5开始提供了java.util.concurrent.atomic包,这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式1、原子更新基本类型类AtomicBoolean:原子更新布尔类型AtomicInteger:原子更新整型AtomicLong:原子更新长整型以AtomicInteger为例:in...原创 2019-02-11 14:45:36 · 488 阅读 · 0 评论 -
Java多线程:Java中的线程池
Java中的线程池使用线程池的好处:1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行3)提高线程的可管理性。使用线程池可以统一分配、调优和监控##1、线程池的实现原理当提交一个新任务到线程池时,线程池的处理流程如下:1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作...原创 2019-02-11 20:34:40 · 571 阅读 · 0 评论 -
Java多线程:Java中的锁
Java中的锁1、Lock接口锁是用来控制多个线程访问共享资源的方式使用synchronized关键字将会隐式地获取锁,但是它将锁的获取和释放固化了,也就是先获取再释放在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放Lock接口提供的synchronized关键字不具备的主要特性:Lock的API:2、队列同步器队列同步器AbstractQueuedSync...原创 2019-02-13 09:06:30 · 698 阅读 · 0 评论 -
Java多线程:Executor框架
Executor框架1、Executor框架简介1)、Executor框架的两级调度模型在HotSpot VM的线程模型中,Java线程被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个操作系统线程也会被回收。操作系统会调度所有线程并将它们分配给可用的CPU在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器将...原创 2019-02-15 10:13:01 · 744 阅读 · 0 评论 -
Java多线程:Java中15种锁的介绍
1、公平锁/非公平锁1)、公平锁:公平锁是指多个线程申请锁的顺序来获取锁2)、非公平锁:非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能申请的线程比先申请的线程优先获取锁。有可能,又造成优先级反转或者饥饿现象对于ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大对于Synchronized而言,是一种非公平锁。...原创 2019-02-18 11:17:39 · 1196 阅读 · 0 评论 -
Java多线程实战篇:生产者和消费者模式
1、什么是生产者和消费者模式?生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通信,而是通过阻塞队列来进行通信,所以生产者生产完数据之后不等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力2、生产者和消费者模式的作用是什么?1)、通过平衡生产者的生产能力和消...原创 2019-02-18 11:35:44 · 666 阅读 · 4 评论 -
Java多线程实战篇:三个线程分别打印A,B,C,要求这三个线程一起运行,打印n次,输出形如“ABCABCABC
Java多线程实战篇:三个线程分别打印A,B,C,要求这三个线程一起运行,打印n次,输出形如“ABCABCABC…”的字符串1、使用Lockpublic class PrintABCUsingLock { // 打印次数 private int times; private int state; private Lock lock = new ReentrantLock(); pu...原创 2019-03-11 23:03:50 · 3346 阅读 · 0 评论 -
Java多线程:创建多少线程才合适?
1、线程执行线程的执行是由CPU进行调度的,一个CPU在同一时刻只会执行一个线程操作系统利用了时间片轮转的方式,CPU给每个任务都服务一定的时间,然后把当前任务的状态保存下来,再加载下一个任务的状态后,继续服务下一个任务。任务的保存及再加载的过程叫作上下文切换,上下文切换会导致额外的开销2、为什么要使用多线程?度量性能的指标最核心的就是延迟和吞吐量。延迟指的是发出请求到收到响应这个过程的时...原创 2019-09-05 13:26:59 · 7991 阅读 · 5 评论 -
二刷Java多线程:ThreadLocal详解
1、ThreadLocal简介ThreadLocal是一个以ThreadLocal对象为键、任意对象为值的存储结构,提供了线程本地变量,也就是如果创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。创建一个ThreadLocal变量后,每个线程都会复制一个变量到自己的本...原创 2019-09-23 19:31:19 · 509 阅读 · 0 评论 -
二刷Java多线程:伪共享详解
一、CPU Cache概述随着CPU的频率不断提升,而内存的访问速度却没有质的突破,为了弥补访问内存的速度慢,充分发挥CPU的计算资源,提高CPU整体吞吐量,在CPU与内存之间引入了一级Cache。随着热点数据体积越来越大,一级CacheL1已经不满足发展的要求,引入了二级Cache L2,三级Cache L3。(若无特别说明,本文的Cache指CPUCache,高速缓存)CPU Cache...原创 2019-09-25 20:20:30 · 489 阅读 · 0 评论 -
二刷Java多线程:Java内存模型
一、可见性、原子性和有序性问题1、Java内存模型的抽象结构与可见性问题在Java中,所有实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享。局部变量、方法定义参数和异常处理器参数不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响Java线程之间的通信由Java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM...原创 2019-09-28 17:20:05 · 738 阅读 · 0 评论 -
二刷Java多线程:并发编程线程基础
1、线程简介1)、什么是线程现代操作系统在运行一个程序时,会为其创建一个进程。现代操作系统调度的最小单位是线程,也叫轻量级进程,在一个进程里可以创建多个线程操作系统在分配资源时是把资源分配给进程的,但是CPU资源比较特殊,它是被分配到线程的,因为真正占用CPU运行的是线程,所以也说线程是CPU分配的基本单位一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计...原创 2019-09-30 20:37:03 · 255 阅读 · 0 评论 -
二刷Java多线程:Java魔法类Unsafe与CAS
前言Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程序出...原创 2019-10-01 10:29:47 · 330 阅读 · 0 评论 -
二刷Java多线程:synchronized关键字详解
一、synchronized简介synchronized块是Java提供的一种原子性内置锁,Java中的每个对象都可以把它当作一个同步锁来使用,这些Java内置的使用者看不到的锁被称为内部锁,也叫作监视器锁。 线程的执行代码在进入synchronized代码块前会自动获取内部锁,这时候其他线程访问该 同步代码块时会被阻塞挂起。拿到内部锁的线程会在正常退出同步代码块或者抛出异常后 或者在同步块内调...原创 2019-10-02 07:40:42 · 380 阅读 · 0 评论 -
二刷Java多线程:Java并发包中锁详解(一):抽象同步队列AQS
一、抽象同步队列AQS队列同步器AbstractQueuedSynchronizer是用来构建锁或者其他组件的基本框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,在抽象方法的实现过程中免不了要对同步状态进行更改,这时就需要使用同步器提供的3个方法来进行操作,因为它们能...原创 2019-10-02 18:49:21 · 423 阅读 · 0 评论 -
二刷Java多线程:Java并发包中锁详解(二):Lock&Condition知识点梳理、独占锁ReentrantLock实现原理
二、Lock&Condition知识点梳理Java SDK并发包通过Lock和Condition两个接口来实现管程,其中Lock用于解决互斥问题(同一时刻只允许一个线程访问共享资源),Condition用于解决同步问题(线程之间如何通信、协作)1、再造管程的理由相比于synchronized关键字实现的互斥锁,Lock具有以下特性:1)、能够响应中断。synchronized的问题...原创 2019-10-03 10:35:51 · 391 阅读 · 0 评论 -
二刷Java多线程:Java并发包中锁详解(三):ReadWriteLock&StampedLock
四、ReadWriteLock知识点梳理1、什么是读写锁读写锁遵循以下三条基本原则:允许多个线程同时读共享变量只允许一个线程写共享变量如果一个写线程正在执行写操作,此时禁止读线程读共享变量读写锁与互斥锁的一个重要区别就是读写锁允许多个线程同时读共享变量,而互斥锁是不允许的,这是读写锁在读多写少场景下性能优于互斥锁的关键。但读写锁的写操作是互斥的,当一个线程在写共享变量的时候,是不允...原创 2019-10-04 14:40:22 · 446 阅读 · 0 评论 -
二刷Java多线程:Java并发包中线程同步器详解(CountDownLatch、CyclicBarrier、Semaphore)
一、等待多线程完成的CountDownLatch1、案例介绍public class CountDownLatchDemo { private static CountDownLatch countDownLatch = new CountDownLatch(2); public static void main(String[] args) throws Interrupt...原创 2019-10-06 18:19:35 · 862 阅读 · 0 评论 -
二刷Java多线程:线程池详解
一、使用线程池的好处降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行提高线程的可管理性:使用线程池可以统一分配、调优和监控二、线程池实现原理当提交一个新任务到线程池时,线程池的处理流程如下:1)、线程池判断核心线程池里的线程是否已满且线程都在执行任务。如果不是,则创建一个新的工作线程来执行任务。否则...原创 2019-10-06 08:46:44 · 281 阅读 · 0 评论