
并发编程
并发编程系列博客
惑边
每一分努力都会在合适的时机得到回报...
展开
-
16-Java多线程、volatile关键字
文章目录volatile关键字一、作用2.1 可见性2.2 有序性二、线程不安全三、volatile应用场景四、底层原理4.1 关于指令重排4.2 内存屏障参考volatile关键字能够被多个线程访问到的变量称之为共享变量,Java中共享变量大多存在于堆中。JMM规定所有的变量都存在主存中,但每个线程都有自己的工作内存,线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作,...原创 2020-01-03 14:32:47 · 364 阅读 · 0 评论 -
17-Future接口
文章目录Future接口一、Future二、RunnableFuture三、FutureTask3.1 构造方法3.2 任务状态和属性3.2.1 任务状态3.2.2 主要属性3.3 任务主体方法3.3.1 run执行任务3.3.2 set设置结果3.3.3 get获取结果3.3.4 cancel取消任务3.4 其他辅助方法3.4.1 awaitDone阻塞3.4.2 finishCompletio...原创 2019-10-21 15:47:38 · 970 阅读 · 0 评论 -
14-线程池源码Executor
文章目录线程池源码Executor一、Executor二、ExecutorService三、AbstractExecutorService3.1 submit3.2 invokeAll3.3 invokeAny四、示例4.1 invokeAll4.1.1 非超时模式4.1.2 超时模式4.2 invokeAny4.2.1 非超时模式4.2.2 超时模式五、小结六、参考线程池源码Executor...原创 2019-10-19 12:34:38 · 311 阅读 · 0 评论 -
02-两线程交替打印(面试题)
文章目录两个线程交替打印方式一:wait-notify方式二:lock-condition方式三:原子变量方式四:LockSupport两个线程交替打印如何让两个线程交替打印内容,比如A1B2C3D4,其中一个线程打印字母,另一个线程打印数字,交替完成输出方式一:wait-notifypublic class Test { private static char[] char...原创 2019-10-17 15:52:12 · 293 阅读 · 0 评论 -
01-PC模式的几种实现(面试题)
文章目录生产者消费者模式一、synchronized同步二、wait-notify三、Condition四、同步队列五、有bug的情况对比生产者消费者模式一、synchronized同步代码public class PcSync { static int MAX = 10; static Queue<Object> queue = new ArrayDeq...原创 2019-08-13 12:44:39 · 361 阅读 · 0 评论 -
15-Java多线程、ThreadLocal
文章目录ThreadLocal一、ThreadLocal二、使用2.1 示例2.2 关键方法三、原理示图示意图四、ThreadLocal源码解析4.1 set4.2 get4.3 initialValue()4.4 remove五、ThreadLocalMap解析5.1 特点六、关于ThreadLocal内存泄露6.1 引用分析6.2 内存泄漏6.2.1 分析6.2.2 条件6.3 改进和解决七、...原创 2019-06-23 17:32:06 · 776 阅读 · 1 评论 -
14-Java多线程、并发安全
文章目录线程安全一、定义二、条件2.1 线程安全条件2.2 线程不安全三、如何做到线程安全?3.1 栈封闭3.2 无状态类3.3 类不可变3.4 volatile3.5 加锁和CAS3.6 安全的发布3.7 ThreadLocal四、线程不安全引起的问题4.1 死锁4.1.1 死锁的条件4.1.2 解决死锁4.1.3 动态顺序死锁4.1.4 解决动态顺序死锁4.2 活锁4.3 线程饥饿五、性能和思...原创 2019-06-20 23:28:54 · 181 阅读 · 0 评论 -
13-Java多线程、线程池框架工具CompletionService
文章目录CompletionService一、示例1.1 代码1.2 输出二、源码2.1 任务提交2.2 QueueingFuture2.3 FutureTask#done2.4 获取结果三、小结CompletionServiceCompletionService是JDK为多线程提供的一个工具类。是用来帮助获取线程池中任务的执行结果的,并且他会先获取已经执行完毕的任务的结果,(简单来说就是...原创 2019-06-20 19:07:32 · 479 阅读 · 0 评论 -
11-Java多线程、线程池框架
文章目录线程池一、线程池1.1 池化技术1.2 线程池优点二、线程池框架2.1 Executor体系2.1 Future体系三、线程池核心参数和方法3.1 参数3.2 方法四、线程池转换状态4.1 线程状态变化4.2 任务处理策略4.3 示意图五、线程池的使用5.1 合理配置线程池5.2 预定义的线程池5.2.1 常见线程池5.2.2 创建方法六、小结七、参考线程池一、线程池1.1 池化技术...原创 2019-06-20 17:44:32 · 182 阅读 · 0 评论 -
10-Java多线程-5、并发容器小结
文章目录并发容器小结一、更多并发容器1.1 跳跃表SkipList1.1.1 ConcurrentSkipListMap1.1.2 ConcurrentSkipListSet1.2 写时复制容器二、非阻塞队列2.1 ConcurrentLinkedQueue三、阻塞队列3.1 概念、生产者消费者模式3.2 常用阻塞队列参考并发容器小结一、更多并发容器1.1 跳跃表SkipList跳跃表(...原创 2019-06-19 23:50:26 · 239 阅读 · 0 评论 -
10-Java多线程-4、并发容器-PriorityBlockingQueue和DelayQueue
并发容器文章目录并发容器一、支持优先级的并发容器PriorityBlockingQueue :支持优先级排序的无界阻塞队列DelayQueue:使用优先级队列实现的无界阻塞队列。二、数据结构2.1 二叉堆2.2 插入元素2.3 删除元素三、PriorityBlockingQueue3.1核心属性:2.2 构造方法默认自然排序2.3 入列操作add:队尾添加,有返回值,不会阻塞put: 队尾添加,...原创 2019-03-06 17:46:21 · 941 阅读 · 0 评论 -
10-Java多线程-3、并发容器-ArrayBlockingQueue和LinkedBlockingQueueee
并发容器一、使用并发容器实现简单的生产者消费者模式ArrayBlockingQueue:由数组结构组成的有界阻塞队列LinkedBlockingQueue:由链表结构组成的有界阻塞队列两者都是继承了AbstractQueue并且实现了BlockingQueue接口;二、ArrayBlockingQueue2.1 ArrayBlockingQueue核心属性:核心属性: /...原创 2019-03-06 14:21:52 · 605 阅读 · 0 评论 -
09-Java多线程-6、AQS工具-LockSupport
文章目录一、LockSupport1.1 初识1.2 本质1.3 许可1.4 示例1.5 小结参考一、LockSupport1.1 初识AQS中依赖的2个类是LockSupport和Unsafe,前者提供线程的(park/unpark操作,后者提供CAS操作),我们先看看JDK源码中对LockSupport的描述用于创建锁和其他同步类的基本线程阻塞原语。1.2 本质LockS...原创 2019-06-12 20:41:40 · 219 阅读 · 0 评论 -
09-Java多线程-5、AQS-基于AQS实现自定义锁
文章目录一、自定义锁二、代码三、测试四、输出一、自定义锁ASQ设计是为了简化并发工具的实现,里面实现了大量线程状态的维护,线程间的同步等待通知等细节,java并发的锁等很多基础组件都是基于AQS来实现的,因此可以通过AQS来自定义实现锁,在AQS类的注释上我们可以看到作者Doug Lea下面一段话,具体真的推荐去看看源码中的英文注释,非常多的注释对理解和使用AQS都很有帮助,读起来吃力可以...原创 2019-06-04 15:29:48 · 545 阅读 · 0 评论 -
09-Java多线程-4、AQS-同步状态的获取与释放(共享式)
文章目录AQS - 同步状态的获取与释放(共享式)一、共享式获取同步状态1.1 不支持中断的acquireShared(int arg)1.1.1 acquireShared(int arg)1.1.2 doAcquireShared1.2 支持中断的acquireSharedInterruptibly(int arg)1.2.1 acquireSharedInterruptibly(int ar...原创 2019-06-04 15:08:36 · 648 阅读 · 0 评论 -
09-Java多线程-3、AQS-同步状态的获取与释放(独占式)
文章目录AQS - 同步状态的获取与释放(独占式)一、独占式获取同步状态1.1 不支持中断的acquire(int arg)1.1.1 acquire(int arg)1.1.2 acquireQueued1.1.3 shouldParkAfterFailedAcquire1.1.4 cancelAcquire1.2 支持中断的acquireInterruptibly(int arg)1.2.1 ...原创 2019-06-04 11:37:50 · 408 阅读 · 0 评论 -
09-Java多线程-2、AQS-CLH队列
文章目录AQS - CLH一、CLH二、Node2.1 Node源码2.2 Node字段解析三、Node操作方法3.1 addWaiter入列3.1.1 代码3.1.2 入列示意图3.2 setHead出列3.2.1 代码3.2.2 出列示意图四、小结AQS - CLH一、CLH在上一篇文章简单介绍了AQS,知道了AQS内部会维护一个同步队列,而这个队列就是CLH(Craig, Land...原创 2019-06-03 17:32:27 · 318 阅读 · 0 评论 -
09-Java多线程-1、AQS-简介
文章目录AQS一、简介二、优势2.1 屏蔽细节2.2 提高性能2.3 AQS体系三、AQS源码初探3.1 同步状态3.2 同步队列3.3 主要方法3.3.1 同步状态的操作方法3.3.2 子类重写方法3.3.2.1 独占式3.3.2.2 共享式3.3.2.3 源码3.3.3 模板方法3.3.3.1 独占式3.3.3.2 共享式3.3.3.3 源码四、小结4.1 方法结构4.2 AQS小结AQS...原创 2019-06-03 14:03:23 · 351 阅读 · 0 评论 -
08-Java多线程-3、锁(显式锁ReentrantReadWriteLock)
文章目录显式锁ReentrantReadWriteLock一、ReadWriteLock接口二、ReentrantReadWriteLock2.1 初识2.2 ReentrantReadWriteLock源码结构2.3 Sync2.3.1 构造方法2.3.2 readerShouldBlock和writerShouldBlock2.3.3 tryAcquireShared读模式获取2.3.4 ...原创 2019-06-02 14:37:07 · 344 阅读 · 0 评论 -
08-Java多线程-2、锁(显式锁ReentrantLock)
文章目录显式锁一、锁的分类和概念1.1 可重入锁1.2 公平锁和非公平锁1.3 读写锁1.4 排它锁二、Lock接口三、可重入锁ReentrantLock3.1 Sync3.2 NonfairSync3.3 FairSync3.4 构造方法3.5 加锁方法3.5.1 lock()3.5.2 lockInterruptibly()3.5.3 tryLock()3.5.4 tryLock(long t...原创 2019-05-31 23:51:53 · 607 阅读 · 0 评论 -
08-Java多线程-1、锁(隐式锁)
文章目录一、隐式锁synchronized1.1 作用1.2 使用1.2.1 同步成员方法1.2.2 同步静态方法1.2.3 同步代码块1.3 代码示例1.4 对象锁和类锁对比二、synchronized优缺点2.1 优点2.2 缺点三、synchronized原理3.1 字节码3.1.1 同步代码块3.1.1.1 monitorenter指令3.1.1.2 monitorexit指令3.1.2 ...原创 2019-05-30 23:57:20 · 355 阅读 · 0 评论 -
07-Java多线程、原子操作和CAS
文章目录一、原子操作1.1 Java中原子操作实现方式1.1.1 悲观锁(阻塞同步)1.1.2 乐观锁(非阻塞同步)1.2 原子操作示例1.2.1 JDK原子操作类型1.2.1 示例二、CAS2.1 CAS的实现原理2.1.1 总线加锁2.1.1 缓存加锁2.2 CAS的缺陷2.2.1 循环时间长2.2.2 只能对一个变量操作2.2.3 ABA问题2.3 解决ABA问题2.3.1 代码三、小结四、...原创 2019-05-28 14:50:50 · 204 阅读 · 1 评论 -
06-Java多线程、并发工具类之Semaphore和Exchanger
文章目录一、Semaphore1.1 概念1.2 示例1.2.1 示例代码1.3 源码分析1.3.1 构造方法1.3.2 Sync1.3.3 NonfairSync1.3.4 FairSync1.3.5 获取许可1.3.5.1 acquire()1.3.5.2 acquireUninterruptibly()1.3.5.3 tryAcquire()1.3.5.4 tryAcquire(long t...原创 2019-05-28 12:54:32 · 948 阅读 · 0 评论 -
05-Java多线程、并发工具类之CountDownLatch和CyclicBarrier
文章目录一、CountDownLatch1.1 概念1.2 示例1.2.1 示例一1.2.2 示例二1.2.3 用法小结1.3 源码解析1.3.1 构造方法1.3.2 await1.3.3 支持超时的await1.3.4 countDown1.3.5 getCount1.3.6 Sync内部类1.4 CountDownLatch原理小结二、CyclicBarrier2.1 概念2.2 示例2.2....原创 2019-05-28 10:26:32 · 281 阅读 · 0 评论 -
03-Java多线程、线程等待通知机制
文章目录线程等待通知机制一、超时模式范式二、自定义连接池2.1 代码实现:三、线程等待通知3.1 代码实现:四、参考线程等待通知机制一、超时模式范式如果等待时长为T,当前时间为now,那么now+T以后超时long overtime = now+Tlong remain = Twhile(result不满足 && remian>0){ wait(remia...原创 2019-05-25 00:33:32 · 404 阅读 · 0 评论 -
02-Java多线程、线程生命周期更多细节
文章目录一、线程生命周期和转换二、线程相关和API三、线程优先级一、线程生命周期和转换运行态->就绪态: 1.yeild让出CPU时间 -- 不释放锁 2.时间片轮转到期就绪态->运行态: 1.获取到CPU时间片 2.join()线程排队运行态->阻塞态: 1.sleep() -- 不释放锁 2.wait() -- 释放锁阻塞态->就绪态:...原创 2019-05-25 00:30:46 · 177 阅读 · 0 评论 -
01-Java多线程、多线程的创建与停止(入门)
一.并发和并行并发是单位时间内可以处理的事件数目并行是同一时刻,可以同时运行的线程数量如果有10个cpu核心,同时可以运行10个线程,那么并行度就是10,每一个任务处理是5ms,那么每秒并发就是10*200=2000二.查看已有线程代码public static void main(String[] args) { ThreadMXBean threadMXBean...原创 2019-04-25 13:58:28 · 683 阅读 · 0 评论 -
锁
锁一、作用线程间同步二、代码 package com.intellif.mozping.lockp.rwl;import com.intellif.mozping.tools.SleepTools;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;...原创 2019-01-02 20:46:33 · 125 阅读 · 0 评论 -
并发工具类 : Exchange
Exchange一、作用Exchange用于在线程之间交换数据二、代码 package com.intellif.mozping.concurrentutil.exchangep;import com.intellif.mozping.tools.SleepTools;import java.util.ArrayList;import java.util.concurre...原创 2019-01-02 19:05:34 · 408 阅读 · 0 评论 -
并发工具类 : CyclicBarrier
CyclicBarrier一、作用CyclicBarrier是并发编程的工具类,当一组线程需要全部到达某一个屏障点之后,后续的操作才可以继续执行,就可以使用CyclicBarrier,比如我们有四个数据采集线程和一个数据分析线程,我们需要在四个采集线程完成采集之后,再执行数据分析线程,可以借助CyclicBarrier来实现二、代码 package com.intellif.mozp...原创 2019-01-02 17:55:58 · 170 阅读 · 0 评论 -
并发工具类 : CountDownLatch
CountDownLatch一、作用CountDownLatchTest是并发编程的工具类,当一个线程需要等待其他一组线程完毕后再执行,就可以使用CountDownLatch,当线程只需要等待其他一个线程的时候我们一般会使用join,CountDownLatch有点像一个加强版的join。比如我们有四个线程同时对某个数据源进行分析,我们需要在四个线程执行完后,主线程将分析结果保存到数据库...原创 2019-01-02 16:20:53 · 201 阅读 · 0 评论 -
[线程池] 关于线程池的五种状态
线程状态在ThreadPoolExecutor类中定义了线程的五种状态表示,通过AtomicInteger 的高三位来表示线程的状态: private static final int COUNT_BITS = Integer.SIZE - 3; private static final int RUNNING = -1 &amp;amp;amp;amp;lt;&amp;amp;amp;amp;lt; COUNT_BITS; p...原创 2018-11-05 14:10:10 · 1403 阅读 · 0 评论