
Java8-concurrent包
淡定一生2333
这个作者很懒,什么都没留下…
展开
-
ThreadLocal是干嘛用的?
ThreadLocal是通过将变量设置成Thread的局部变量,即使用该变量的线程提供一个独立的副本,可以独立修改,不会影响其他线程的副本,这样来解决多线程的并发问题。ThreadLocal主要是线程不安全的类在多线程中使用,一般常用于数据库连接和Session管理。看下ThreadLocal的官方注释:{@code ThreadLocal} instances are typically...原创 2019-12-09 22:56:50 · 1678 阅读 · 1 评论 -
wait/notify与Condition简单分析
今天在翻《Effective Java》的时候偶然看到,并发工具优先与wait和notify,突然来了兴趣,探究下为什么这么说。先了解下wait 和 notify的作用:这两个方法的目的是为了避免自旋(或者说是等待)带来的性能损失。如果没有wait/notify,线程需要不停的轮询去查看某一条件是否达到了,这样就造成了CPU的浪费。而通过使用wait让线程挂起,等到条件运行完了再使用...原创 2019-09-05 20:04:03 · 3105 阅读 · 0 评论 -
读写锁ReentrantReadWriteLock简单分析
之前分析过synchronized和ReentrantLock,这两种锁都是排他锁,即一个资源同一时刻只能被一个线程占有,线程释放了锁之后,其他线程才能去抢占这个资源。但是JUC中还有一个读写锁ReentrantReadWriteLock,可以提升读远远多于写这种场景下的性能,本文当算来分析下它的内部原理。读写锁概念介绍:获取锁的方式和ReentrantLock很像,都是基于AQS实...原创 2019-08-06 20:37:13 · 952 阅读 · 0 评论 -
ForkJoinPool初略分析
之前曾经分析过线程池,在Jdk1.7中出现了一种新的线程池ForkJoinPool,Java8中的parallelStream API就是基于ForkJoinPool实现的,它和普通的线程池不太一样,本文来分析下ForkJoinPool内部运行原理。本来想着直接分析parallelStream,看了半天看不懂,果然学习没有捷径啊…为什么要有ForkJoinPool: 计算机...原创 2019-04-07 23:02:42 · 6769 阅读 · 4 评论 -
线程池自带的那些拒绝策略
今天被边上的小伙伴问到如果线程池处理不过来,但是队列又是个有界队列的时候该怎么办,害得我又翻了半天书重看了下线程池的相关内容。哎,有些东西一段时间不用之后就有可能忘了,所以趁这个机会来深入了解下JDK1.8线程池的拒绝策略,其实也蛮简单的。 线程池的拒绝策略有如下四种:AbortPolicy:丢弃任务并抛出RejectedExecutionException异常 (默认)Disca...原创 2019-02-20 22:44:11 · 1891 阅读 · 0 评论 -
线程安全的List
对于JDK中的线程安全集合类,个人用的一般是map和队列相关的用的比较多,线程安全的List很少会接触到。开发的时候突然遇到别人问我说有没有线程安全的List…一脸懵逼,所以决定网上找找看有没有相关的结构,别说,还真找到了:Collections.synchronizedList与CopyOnWriteArrayList本人之前写的话都是用一个锁来锁定的,今天就来看下这两种结构是不是会比自...原创 2019-01-09 22:54:03 · 49224 阅读 · 2 评论 -
ScheduledThreadPoolExecutor源码分析
在项目中经常需要开启一些定时任务,只知道如何使用却不知道内部原理,今天就来分析下ScheduledThreadPoolExecutor线程池内部的运行原理。ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,所以它有线程池的功能(之前写过一篇分析ThreadPoolExecutor源码的文章)。并且它实现了ScheduledExecutorServ...原创 2019-01-12 22:32:08 · 1004 阅读 · 0 评论 -
阻塞队列ArrayBlockingQueue源码分析
Java中阻塞队列的类型:Java中的阻塞队列一共有7种,它们分别是:ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。DealyQueue:一个使用优先级队列实现的无界阻塞队列。Synchronous...原创 2018-12-23 22:04:24 · 212 阅读 · 0 评论 -
Semaphore源码分析
Semaphore作用:以一个停车场运作为例来说明信号量的作用。假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦。以后来的车必须在入口等待,直到停车场中有车辆离开。这时,如果有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开一辆,则又可以放入一辆,如此往复。感觉它的运用方式和线程池有点类似,线程池中一共就那么多个...原创 2018-12-20 22:29:36 · 190 阅读 · 0 评论 -
CountDownLatch源码分析
package Source;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CountDownLatchTest { private static CountDownLatch COUNT = new CountDownLatch(2); publ原创 2018-12-03 21:45:54 · 227 阅读 · 0 评论 -
ReenterLock内部是怎么实现的
ReentrantLock内部有公平锁和非公平锁两种,而这两种锁都是基于AQS同步器实现的。AQS同步器太难看懂,先简单看下ReentrantLock的源码,再反推回去看AQS。 公平锁 VS 非公平锁:1、公平锁能保证:老的线程排队使用锁,新线程仍然排队使用锁。2、非公平锁保证:老的线程排队使用锁;但是无法保证新线程抢占已经在排队的线程的锁。 在ReentrantLock...原创 2018-11-19 22:17:21 · 2218 阅读 · 0 评论 -
线程池实现分析
为什么需要线程池:重复利用池中的线程避免了每次新建和销毁线程的开销 加快任务速度,由于池中线程早已存在 提高线程的可管理性。无限制的创建线程终究会达到系统上限并且不利于对线程使用的监控。Executor框架概览:从左往右,从上往下开始介绍:Executor: 该接口只有一个void execute(Runnable command)方法,这么做是将任务的提交与执行分离。...原创 2018-11-19 22:26:02 · 217 阅读 · 0 评论 -
CyclicBarrier源码分析
由一个笑话引发的一些思考:据说是一个月薪 9K 的 Java 程序员,因老板让他写一个排序算法,然后他就写了一段屌炸天的休眠排序算法,接着他就被老板开除了……算法长这样: 突然想到的问题时,由于你的线程是一个一个开的,它们开始执行的时间不一样,如果数字都是很近的话,排出来的顺序可能都是不一致的。然后突然就想到了CyclicBarrier……然后就想知道下它里面是怎么保证多个线程在同...原创 2018-11-18 23:10:18 · 2000 阅读 · 1 评论 -
volatile、Synchronized与final一些理解
volatile: 使用volatile修饰的共享变量在写操作的时候会多出Lock指令,会立即引发两种效果:将当前变量的值从工作内存写会到主内存中 其他CPU里面缓存的该变量的值会置为无效(由缓存一致性协议保障)---- 锁缓存的开销比锁总线的开销要少很多,锁总线意味着不能访问系统内存!3.禁止读和写的重排序 – 双重锁问题就是通过这个解决的!(第一个操作是volatile写...原创 2018-08-11 17:19:56 · 909 阅读 · 6 评论 -
悲观锁,乐观锁以及AtomicInteger原子类介绍
悲观锁与乐观锁介绍:悲观锁: 即排他锁,假设冲突总会存在,即每次拿数据的时候都认为别人会修改,所以每次拿数据都会加锁.比如synchronize乐观锁: 假设每次取拿数据的时候,都没有别人在操作,所以不会上锁.但是在更新的时候会判断下再此期间有没有没人去更新过这个数据.常用的有版本号控制/CAS等等. 乐观锁一般多用于读这种场景,...原创 2018-09-06 15:14:25 · 698 阅读 · 0 评论