Fork me on GitHub
摘要: 概述 上篇文章简单介绍了和线程池相关的类和接口,本文就详细介绍下其中一个类ThreadPoolExecutor,该类实现了线程池的功能,其基本原理就是使用一个HashSet集合存放Worker,Worker也实现了Runnable接口,重写了run方法,所以可认为这就是一个线程。如果设置线程池线程数 阅读全文
posted @ 2020-09-16 14:52 猿起缘灭 阅读(297) 评论(0) 推荐(0) 编辑
摘要: 概述 随着摩尔定律失效,多核计算器成为主流,多线程提高执行效率就变得异常重要,而线程的创建销毁又是一个开销比较大的操作,于是就产生了线程池,把使用过的线程放入线程池中,重复利用,其思想就是这些,很简单,但是线程池的管理就没有那么简单了,首先要管理好多个线程,然后还要管理任务,所以整个事情就变得复杂起 阅读全文
posted @ 2020-09-15 18:30 猿起缘灭 阅读(572) 评论(0) 推荐(0) 编辑
摘要: 概述 LinkedBlockingQueue也是一个阻塞队列,相比于ArrayBlockingQueue,他的底层是使用链表实现的,而且是一个可有界可无界的队列,在生产和消费的时候使用了两把锁,提高并发,是一个高效的阻塞队列,下面就分析一下这个队列的源码。 属性 //链表节点定义 static cl 阅读全文
posted @ 2020-09-14 11:30 猿起缘灭 阅读(815) 评论(0) 推荐(0) 编辑
摘要: 概述 在上篇文章的结构图中可以看出,所有的队列最后都实现了Queue接口,而Queue继承了Collection接口,而Collection接口继承了Iterable,由于不同的集合会根据自己集合的特性实现自己的迭代器,那本文就分析一下ArrayBlockingQueue集合迭代器的实现方式,因为之 阅读全文
posted @ 2020-09-14 10:49 猿起缘灭 阅读(450) 评论(0) 推荐(0) 编辑
摘要: 概述 ArrayBlockingQueue是一个阻塞队列,其实底层就是一个数组,说到底层是数组,ArrayList底层也是数组,那它其实也可以作为队列,但是是非阻塞的,那阻塞和非阻塞的区别是什么?区别在于当队列中没有元素的时候就阻塞等待,直到队列中有数据再消费,而如果队列满了之后(队列有界),生产者 阅读全文
posted @ 2020-09-13 00:06 猿起缘灭 阅读(821) 评论(0) 推荐(0) 编辑
摘要: 概述 由于ConcurrentHashMap是一个高并发的集合,集合中增删就比较频繁,那计数就变成了一个问题,如果使用像AtomicInteger这样类型的变量来计数,虽然可以保证原子性,但是太多线程去竞争CAS,自旋也挺浪费时间的,所以ConcurrentHashMap使用了一种类似LongAdd 阅读全文
posted @ 2020-09-11 19:11 猿起缘灭 阅读(1879) 评论(1) 推荐(0) 编辑
摘要: 概述 在上一篇文章中介绍了ConcurrentHashMap的存储结构,以及put和get方法,那本篇文章就介绍一下其扩容原理。其实说到扩容,无非就是新建一个数组,然后把旧的数组中的数据拷贝到新的数组中,在HashMap的实现中,由于没有加锁,可能会同时有多个线程创建了多个数组,而且拷贝的时候也没有 阅读全文
posted @ 2020-09-11 16:10 猿起缘灭 阅读(1818) 评论(1) 推荐(2) 编辑
摘要: 概述 ConcurrentHashMap,一个线程安全的高性能集合,存储结构和HashMap一样,都是采用数组进行分桶,之后再每个桶中挂一个链表,当链表长度大于8的时候转为红黑树,其实现线程安全的基本原理是采用CAS + synchronized组合,当数组的桶中没有元素时采用CAS插入,相反,则采 阅读全文
posted @ 2020-09-11 11:57 猿起缘灭 阅读(503) 评论(0) 推荐(0) 编辑
摘要: 概述 CyclicBarrier,一个同步辅助类,其作用是让一组线程到达公共屏障点时阻塞,直到最后一个线程也到达公共屏障点,屏障才会打开,而且该屏障(barrier)在这一组线程释放后可以重用,所以称为循环(Cyclic)的屏障(Barrier)。看功能和CountDownLatch一样,但是两者的 阅读全文
posted @ 2020-09-09 15:21 猿起缘灭 阅读(568) 评论(0) 推荐(0) 编辑
摘要: 概述 ThreadLocal是面试非常高频的问题,在很多框架源码中都可以看到他的身影,比如Spring,ReentrantReadWriteLock,然后在平时的工作使用的却并不多,ThreadLocal要解决并不是多线程修改共享变量保证线程安全的问题,这个是通过悲观锁(比如synchronized 阅读全文
posted @ 2020-09-09 09:47 猿起缘灭 阅读(346) 评论(0) 推荐(0) 编辑