
Java并发专题
Java并发专题
吃瓜老鱼
今天的BUG保熟吗?
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JAVA并发二十九:一篇文章,让你彻底弄懂生产者–消费者问题
原博地址:https://www.javazhiyin.com/18117.html生产者-消费者模式是一个十分经典的多线程并发协作的模式,弄懂生产者-消费者问题能够让我们对并发编程的理解加深。所谓生产者-消费者问题,实际上主要是包含了两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,为了解耦生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库,生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为;而消费者只需要从共享数据区中去获取数据,就不再需要关心生产者的转载 2020-05-17 17:57:04 · 180 阅读 · 0 评论 -
JAVA并发系列二十八:大白话说java并发工具类-Semaphore,Exchanger
原博地址:https://www.javazhiyin.com/18114.html1. 控制资源并发访问–SemaphoreSemaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源。Semaphore就相当于一个许可证,线程需要先通过acquire方法获取该许可证,该线程才能继续往下执行,否则只能在该方法出阻塞等待。当执行完业务功能后,需要通过release()方法将许可证归还,以便其他线程能够获得许可证继续执行。Semaphore可以用于做流量转载 2020-05-17 17:51:34 · 158 阅读 · 0 评论 -
JAVA并发系列二十七:大白话说java并发工具类-CountDownLatch,CyclicBarrier
原博地址:https://www.javazhiyin.com/18110.html1. 倒计时器CountDownLatch在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join方法,让主线程等待被join的线程执行完之后,主线程才能继续往下执行。当然,使用线程间消息通信机制也可以完成。其实,java并发工具类中为我们提供了类似“倒计时”这样的工具类,可以十分方便的完成所说的这种业务场景。为了能够理转载 2020-05-17 17:47:49 · 164 阅读 · 0 评论 -
JAVA并发系列二十六:Java中atomic包下原子操作类总结
原博地址:https://www.javazhiyin.com/18107.html1. 原子操作类介绍在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全的目的。但是由于synchronized是采用的是悲观锁策略,并不是特别高效的一种解决方案。实际上,在J.U.C下的atomic包提供了一系列的操作简单,性能高效,并能保证线程安全的类去更新基转载 2020-05-17 17:42:46 · 819 阅读 · 0 评论 -
JAVA并发系列二十五:带你认识FutureTask
原博地址:https://www.javazhiyin.com/18102.html1.FutureTask简介在Executors框架体系中,FutureTask用来表示可获取结果的异步任务。FutureTask实现了Future接口,FutureTask提供了启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果的一些常用的方法。通过get()方法来获取异步任务的结果,但是会阻塞当前线程直至异步任务执行结束。一旦任务执行结束,任务不能重新启动或取消,除非调用runAndReset(转载 2020-05-17 17:36:35 · 150 阅读 · 0 评论 -
JAVA并发系列二十四:线程池之ScheduledThreadPoolExecutor
原博地址:https://www.javazhiyin.com/18098.html1. ScheduledThreadPoolExecutor简介ScheduledThreadPoolExecutor可以用来在给定延时后执行异步任务或者周期性执行任务,相对于任务调度的Timer来说,其功能更加强大,Timer只能使用一个后台线程执行任务,而ScheduledThreadPoolExecutor则可以通过构造函数来指定后台线程的个数。ScheduledThreadPoolExecutor类的UML图如下转载 2020-05-17 17:34:14 · 256 阅读 · 0 评论 -
JAVA并发系列二十三:线程池ThreadPoolExecutor实现原理
原博地址:https://www.javazhiyin.com/18095.html1. 为什么要使用线程池线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 例如,线程数一般取cpu数量+2比较合适,线程数过多会导致额外的线程转载 2020-05-17 17:23:01 · 152 阅读 · 0 评论 -
JAVA并发系列二十二:LinkedBlockingQueue实现原理
原博地址:https://www.javazhiyin.com/18092.html在上一篇文章中我们分析了ArrayBlockingQueue的实现原理,在这一篇文章中我们一起去寻踪LinkedBlockingQueue。3. LinkedBlockingQueue实现原理LinkedBlockingQueue是用链表实现的有界阻塞队列,当构造对象时为指定队列大小时,队列默认大小为Integer.MAX_VALUE。从它的构造方法可以看出:public LinkedBlockingQueue()转载 2020-05-17 17:12:44 · 268 阅读 · 0 评论 -
JAVA并发系列二十一:ArrayBlockingQueue实现原理
原博地址:https://www.javazhiyin.com/18090.html1. ArrayBlockingQueue简介在多线程编程过程中,为了业务解耦和架构设计,经常会使用并发容器用于存储多线程间的共享数据,这样不仅可以保证线程安全,还可以简化各个线程操作。例如在“生产者-消费者”问题中,会使用阻塞队列(BlockingQueue)作为数据容器,关于BlockingQueue可以看该系列第十六篇文章。为了加深对阻塞队列的理解,唯一的方式是对其实验原理进行理解,这篇文章就主要来看看ArrayB转载 2020-05-17 17:05:59 · 304 阅读 · 0 评论 -
JAVA并发系列二十:并发容器之BlockingQueue
原博地址:https://www.javazhiyin.com/18084.html1. BlockingQueue简介在实际编程中,会经常使用到JDK中Collection集合框架中的各种容器类如实现List,Map,Queue接口的容器类,但是这些容器类基本上不是线程安全的,除了使用Collections可以将其转换为线程安全的容器,Doug Lea大师为我们都准备了对应的线程安全的容器,如实现List接口的CopyOnWriteArrayList,实现Map接口的ConcurrentHashMap转载 2020-05-17 17:02:57 · 171 阅读 · 0 评论 -
JAVA并发系列十九:深入理解ThreadLocal(三)–详解ThreadLocal内存泄漏问题
原博地址:https://www.javazhiyin.com/18072.html1. 造成内存泄漏的原因?threadLocal是为了解决对象不能被多线程共享访问的问题,通过threadLocal.set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中,这样每个线程使用自己的对象实例,彼此不会影响达到隔离的作用,从而就解决了对象在被共享访问带来线程安全问题。如果将同步机制和threadLocal做一个横向比较的话,同步机制就是通过控制线程访问共享对象的顺序,而threadLoc转载 2020-05-17 16:57:28 · 743 阅读 · 1 评论 -
JAVA并发系列十八:深入理解ThreadLocal(二)
原博地址:https://www.javazhiyin.com/18065.html接上一篇,继续深扒ThreadLocal中最重要的ThreadLocalMap知识点3. ThreadLocalMap详解从上面的分析我们已经知道,数据其实都放在了threadLocalMap中,threadLocal的get,set和remove方法实际上具体是通过threadLocalMap的getEntry,set和remove方法实现的。如果想真正全方位的弄懂threadLocal,势必得在对threadLoc转载 2020-05-17 16:45:42 · 279 阅读 · 0 评论 -
JAVA并发专题十七:深入理解ThreadLocal(一)
原博地址:https://www.javazhiyin.com/18063.html1. ThreadLocal的简介在多线程编程中通常解决线程安全的问题我们会利用synchronzed或者lock控制线程对临界区资源的同步顺序从而解决线程安全的问题,但是这种加锁的方式会让未获取到锁的线程进行阻塞等待,很显然这种方式的时间效率并不是很好。线程安全问题的核心在于多个线程会对同一个临界区共享资源进行操作,那么,如果每个线程都使用自己的“共享资源”,各自使用各自的,又互相不影响到彼此即让多个线程间达到隔离的状转载 2020-05-17 16:31:58 · 190 阅读 · 0 评论 -
JAVA并发十六:并发容器之ConcurrentLinkedQueue
原博地址:https://www.javazhiyin.com/6299.html1.ConcurrentLinkedQueue简介在单线程编程中我们会经常用到一些集合类,比如ArrayList,HashMap等,但是这些类都不是线程安全的类。在面试中也经常会有一些考点,比如ArrayList不是线程安全的,Vector是线程安全。而保障Vector线程安全的方式,是非常粗暴的在方法上用synchronized独占锁,将多线程执行变成串行化。要想将ArrayList变成线程安全的也可以使用Collec转载 2020-05-17 16:26:30 · 258 阅读 · 0 评论 -
JAVA并发十五:并发容器之CopyOnWriteArrayList
原博地址:https://www.javazhiyin.com/6294.html1.CopyOnWriteArrayList的简介java学习者都清楚ArrayList并不是线程安全的,在读线程在读取ArrayList的时候如果有写线程在写数据的时候,基于fast-fail机制,会抛出ConcurrentModificationException异常,也就是说ArrayList并不是一个线程安全的容器。当然您可以用Vector,或者使用Collections的静态方法将ArrayList包装成一个线转载 2020-05-16 23:15:15 · 160 阅读 · 0 评论 -
JAVA并发十四:并发容器之ConcurrentHashMap(JDK 1.8版本)
原博地址:https://www.javazhiyin.com/6288.html1.ConcurrentHashmap简介在使用HashMap时在多线程情况下扩容会出现CPU接近100%的情况,因为hashmap并不是线程安全的,通常我们可以使用在java体系中古老的hashtable类,该类基本上所有的方法都采用synchronized进行线程安全的控制。可想而知,在高并发的情况下,每次只有一个线程能够获取对象监视器锁,这样的并发性能的确不令人满意。另外一种方式通过Collections的Maps转载 2020-05-16 23:11:00 · 279 阅读 · 0 评论 -
JAVA并发十三:LockSupport工具
原博地址:https://www.javazhiyin.com/6284.html1.LockSupport简介在之前介绍AQS的底层实现,已经在介绍java中的Lock时,比如ReentrantLock,ReentReadWriteLocks,已经在介绍线程间等待/通知机制使用的Condition时都会调用LockSupport.park()方法和LockSupport.unpark()方法。而这个在同步组件的实现中被频繁使用的LockSupport到底是何方神圣,现在就来看看。LockSuppor转载 2020-05-16 22:57:38 · 203 阅读 · 0 评论 -
JAVA并十二:详解Condition的await和signal等待/通知机制
原博地址:https://www.javazhiyin.com/6274.htmlCondition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来看Object的wait和not转载 2020-05-16 22:54:36 · 423 阅读 · 0 评论 -
JAVA并发十一:深入理解读写锁ReentrantReadWriteLock
原博地址:https://www.javazhiyin.com/6269.html1.读写锁的介绍在并发场景中用于解决线程安全的问题,我们几乎会高频率的使用到独占式锁,通常使用java提供的关键字synchronized(关于synchronized可以看这篇文章)或者concurrents包中实现了Lock接口的ReentrantLock。它们都是独占式获取锁,也就是在同一时刻只有一个线程能够获取锁。而在一些业务场景中,大部分只是读数据,写数据很少,如果仅仅是读数据的话并不会影响数据正确性(出现脏读转载 2020-05-16 22:45:00 · 205 阅读 · 0 评论 -
JAVA并发十:彻底理解ReentrantLock
原博地址:https://www.javazhiyin.com/6265.html1. ReentrantLock的介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性,synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。那么,要想完完全转载 2020-05-16 22:40:06 · 123 阅读 · 0 评论 -
JAVA并发九:深入理解AbstractQueuedSynchronizer(AQS)
原博地址:https://www.javazhiyin.com/6255.html1. AQS简介在上一篇文章中我们对lock和AbstractQueuedSynchronizer(AQS)有了初步的认识。在同步组件的实现中,AQS是核心部分,同步组件的实现者通过使用AQS提供的模板方法实现同步组件语义,AQS则实现了对同步状态的管理,以及对阻塞线程进行排队,等待通知等等一些底层的实现处理。AQS的核心也包括了这些方面:同步队列,独占式锁的获取和释放,共享锁的获取和释放以及可中断锁,超时等待锁获取这些转载 2020-05-16 22:35:45 · 220 阅读 · 0 评论 -
JAVA并发八(下):初识Lock与AbstractQueuedSynchronizer(AQS)
原博地址:https://www.javazhiyin.com/999.html1. concurrent包的结构层次在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们队并发编程的掌握更加透彻也会大大提升我们队并发编程技术的热爱。这些代码在java.util.concurrent包下。如下图,即为concurrent包的目录结构图。其中包含了两个子包:atomic以及lock,另外在concurrent下的阻塞队列以及executors,这些就是转载 2020-05-16 22:20:33 · 178 阅读 · 0 评论 -
JAVA并发八(上):三大性质总结:原子性、可见性以及有序性
原博地址:https://www.javazhiyin.com/993.html1. 三大性质简介在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则(在这篇文章中已经讲过了),三条性质:原子性,有序性和可见性。关于synchronized和volatile已经讨论过了,就想着将并发编程中这两大神器在 原子性,有序性和可见性上做一个比较,当然这也是面试中的高频考点,值得注意。2. 原子性原子性是指一个操作是不可中断的,要么全部执行成功转载 2020-05-16 22:13:56 · 180 阅读 · 0 评论 -
JAVA并发七:你以为你真的了解final吗?
1. final的简介final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如String类就是一个final类型的类。即使能够知道final具体的使用方法,我想对final在多线程中存在的重排序问题也很容易忽略,希望能够一起做下探讨。2. final的具体使用场景final能够修饰变量,方法和类,也就是final使用范围基本涵盖了java每个地方,下面就分别以锁修饰的位置:变量,方法和类分别来说一说。2.1 变量在java中变量,可以分为成员变量以及方法局部变量。因转载 2020-05-16 22:10:21 · 265 阅读 · 0 评论 -
JAVA并发六:彻底理解volatile
原博地址:https://www.javazhiyin.com/887.html1. volatile简介在上一篇文章中我们深入理解了java关键字,我们知道在java中还有一大神器就是关键volatile,可以说是和synchronized各领风骚,其中奥妙,我们来共同探讨下。通过上一篇的文章我们了解到synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁。而volatile就可以说是java虚拟机提供的最轻量级的同步机制。但它同时不容易被正确理解,也至于在并发编程中很多程序员转载 2020-05-16 20:18:13 · 168 阅读 · 0 评论 -
java多线程面试题整理及答案(2019年)
原博地址:https://www.cnblogs.com/xiaowangbangzhu/p/10443289.html1) 什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层...转载 2020-04-22 22:31:14 · 290 阅读 · 0 评论 -
JAVA并发五:彻底理解synchronized
1. synchronized简介在学习知识前,我们先来看一个现象:public class SynchronizedDemo implements Runnable { private static int count = 0; public static void main(String[] args) { for (int i = 0; i < ...转载 2020-05-16 20:11:20 · 263 阅读 · 0 评论 -
JAVA并发四:Java内存模型以及happens-before规则
1. JMM的介绍在上一篇文章中总结了 线程的状态转换以及基本操作,对多线程已经有一点基本的认识了,如果多线程编程只有这么简单,那我们就不必费劲周折的去学习它了。在多线程中稍微不注意就会出现线程安全问题,那么什么是线程安全问题?我的认识是,在多线程下代码执行的结果与预期正确的结果不一致,该代码就是线程不安全的,否则则是线程安全的。虽然这种回答似乎不能获取什么内容,可以google下。在<&...转载 2020-05-16 20:10:46 · 241 阅读 · 0 评论 -
JAVA并发三:线程的状态转换以及基本操作
在上一篇文章中并发编程的优缺点谈到了为什么花功夫去学习并发编程的技术,也就是说我们必须了解到并发编程的优缺点,我们在什么情况下可以去考虑开启多个线程去实现我们的业务,当然使用多线程我们应该着重注意一些什么,在上一篇文章中会有一些讨论。那么,说了这么多,无论是针对面试还是实际工作中作为一名软件开发人员都应该具备这样的技能。万事开头难,接下来就应该了解如何新建一个线程?线程状态是怎样转换的?关于线程状...转载 2020-05-16 20:10:09 · 156 阅读 · 0 评论 -
JAVA并发二:并发编程的优缺点
一直以来并发编程对于刚入行的小白来说总是觉得高深莫测,于是乎,就诞生了想写点东西记录下,以提升理解和堆并发编程的认知。为什么需要用的并发?凡事总有好坏两面,之间的trade-off是什么,也就是说并发编程具有哪些缺点?以及在进行并发编程时应该了解和掌握的概念是什么?这篇文章主要以这三个问题来谈一谈。1. 为什么要用到并发一直以来,硬件的发展极其迅速,也有一个很著名的"摩尔定律",可能会奇怪明明...转载 2020-05-16 20:09:35 · 173 阅读 · 0 评论 -
JAVA并发一:Java 并发编程简介
简介: 操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都在单独的进程中运行:操作系统为各个独立执行的进程分配好资源,包括内存,文件句柄以及安全证书等,在不同的进程之间可以通过一些粗粒度的通信机制来交换数据,包括:套接字、信号处理器、共享内存、信号量以及文件等;一种高效的运行方式是通过粗粒度的时间分片(Time Slicing)使这些用户和程序能共享计算机资源,而不是由...转载 2020-05-16 20:08:39 · 153 阅读 · 0 评论