随笔分类 -  并发编程

摘要:以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同 阅读全文
posted @ 2019-01-27 16:53 chen_hao 阅读(1361) 评论(0) 推荐(2) 编辑
摘要:以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同 阅读全文
posted @ 2019-01-25 18:56 chen_hao 阅读(1099) 评论(1) 推荐(1) 编辑
摘要:在上一篇线程池的文章《并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)》中从ThreadPoolExecutor源码分析了其运行机制。限于篇幅,留下了ScheduledThreadPoolExecutor未做分析,因此本文继续从源代码出发分析ScheduledThreadPool 阅读全文
posted @ 2019-01-18 09:31 chen_hao 阅读(3451) 评论(1) 推荐(5) 编辑
摘要:我们知道线程池运行时,会不断从任务队列中获取任务,然后执行任务。如果我们想实现延时或者定时执行任务,重要一点就是任务队列会根据任务延时时间的不同进行排序,延时时间越短地就排在队列的前面,先被获取执行。 队列是先进先出的数据结构,就是先进入队列的数据,先被获取。但是有一种特殊的队列叫做优先级队列,它会 阅读全文
posted @ 2019-01-16 14:24 chen_hao 阅读(2629) 评论(1) 推荐(3) 编辑
摘要:前两篇文章讲了线程池的源码分析,再来看这篇文章就比较简单了, 本文主要讲解 Executors 这个工具类,看看长江创建线程池的几种方法。 newFixedThreadPool 生成一个固定大小的线程池: 1 public static ExecutorService newFixedThreadP 阅读全文
posted @ 2019-01-14 16:12 chen_hao 阅读(1173) 评论(0) 推荐(1) 编辑
摘要:在上一篇《并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)》中提到了线程池ThreadPoolExecutor的原理以及它的execute方法。这篇文章是接着上一篇文章写的,如果你没有阅读上一篇文章,建议你去读读。本文解析ThreadPoolExecutor#submit。 对于 阅读全文
posted @ 2019-01-14 09:57 chen_hao 阅读(1606) 评论(0) 推荐(1) 编辑
摘要:史上最清晰的线程池源码分析 鼎鼎大名的线程池。不需要多说!!!!! 这篇博客深入分析 Java 中线程池的实现。 总览 下图是 java 线程池几个相关类的继承结构: 先简单说说这个继承结构,Executor 位于最顶层,也是最简单的,就一个 execute(Runnable runnable) 接 阅读全文
posted @ 2019-01-11 16:18 chen_hao 阅读(2483) 评论(0) 推荐(1) 编辑
摘要:BlockingQueue 实现之 SynchronousQueue SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take,反过来也一样。 不像ArrayBlockingQueue或LinkedListBloc 阅读全文
posted @ 2019-01-09 09:30 chen_hao 阅读(1232) 评论(0) 推荐(1) 编辑
摘要:LinkedBlockingQueue 在看源码之前,通过查询API发现对LinkedBlockingQueue特点的简单介绍: 1、LinkedBlockingQueue是一个由链表实现的有界队列阻塞队列。2、新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素3、大小默认值为Integ 阅读全文
posted @ 2019-01-08 14:17 chen_hao 阅读(1402) 评论(0) 推荐(4) 编辑
摘要:开篇先介绍下 BlockingQueue 这个接口的规则,后面再看其实现。 阻塞队列概要 阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点,在于阻塞队列的阻塞添加和阻塞删除方法。 阻塞添加 所谓的阻塞添加是指当阻塞队列元素已满时,队列会阻塞加入元素的线程,直 阅读全文
posted @ 2019-01-07 16:47 chen_hao 阅读(1849) 评论(0) 推荐(2) 编辑
摘要:这篇,我们的关注点是 AQS 最后的部分,共享模式的使用。本文先用 CountDownLatch 将共享模式说清楚,然后顺着把其他 AQS 相关的类 CyclicBarrier、Semaphore 的源码一起过一下。 CountDownLatch CountDownLatch 这个类是比较典型的 A 阅读全文
posted @ 2018-12-29 15:24 chen_hao 阅读(1160) 评论(0) 推荐(3) 编辑
摘要:我们接着上一篇文章继续,本文讲讲解ReentrantLock 公平锁和非公平锁的区别,深入分析 AbstractQueuedSynchronizer 中的 ConditionObject 公平锁和非公平锁 ReentrantLock 默认采用非公平锁,除非你在构造方法中传入参数 true 。 pub 阅读全文
posted @ 2018-12-28 10:09 chen_hao 阅读(1392) 评论(1) 推荐(2) 编辑
摘要:本文将从 ReentrantLock 的公平锁源码出发,分析下 AbstractQueuedSynchronizer 这个类是怎么工作的,希望能给大家提供一些简单的帮助。 AQS 结构 先来看看 AQS 有哪些属性,搞清楚这些基本就知道 AQS 是什么套路了! AbstractQueuedSynch 阅读全文
posted @ 2018-12-26 10:16 chen_hao 阅读(2154) 评论(1) 推荐(2) 编辑
摘要:今天我们一起探讨下ThreadLocal的实现原理和源码分析。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。相信本文一定能让大家完全了解ThreadLocal。 ThreadLocal是什么? T 阅读全文
posted @ 2018-12-07 09:25 chen_hao 阅读(1798) 评论(0) 推荐(5) 编辑
摘要:ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Synchronized,ReentrantLock增加了一些高级的扩展功能,比如它可以实现公平锁,同时也可 阅读全文
posted @ 2018-11-29 11:57 chen_hao 阅读(6427) 评论(2) 推荐(3) 编辑
摘要:本文将讲解CountDownLatch,CyclicBarrier和Semaphore这三个并发包里面的辅助类。 本文将讲解CountDownLatch,CyclicBarrier和Semaphore这三个并发包里面的辅助类。 CountDownLatch 正如每个Java文档所描述的那样,Coun 阅读全文
posted @ 2018-11-23 15:23 chen_hao 阅读(2541) 评论(0) 推荐(3) 编辑
摘要:本文将讲解volatile关键字和 atomic包,为什么放到一起讲呢,主要是因为这两个可以解决并发编程中的原子性、可见性、有序性,让我们一起来看看吧。 本文将讲解volatile关键字和 atomic包,为什么放到一起讲呢,主要是因为这两个可以解决并发编程中的原子性、可见性、有序性,让我们一起来看 阅读全文
posted @ 2018-11-16 16:45 chen_hao 阅读(9137) 评论(3) 推荐(14) 编辑

点击右上角即可分享
微信分享提示