并发编程
文章平均质量分 96
Java并发编程是整个Java开发体系中最难以理解但也是最重要的知识点之一,因此学习起来比较费劲,从而导致很多人望而却步,但是无论是职场面试还是高并发高流量的系统的实现都离不开并发编程,能够真正掌握并发编程的人才在市场上供不应求。
ThinkWon
敏于观察,勤于思考,善于综合,勇于创新。
展开
-
Java 8 的异步编程利器 CompletableFuture 详解
文章目录一个例子回顾 Future一个例子走进CompletableFutureCompletableFuture使用场景创建异步任务supplyAsync方法runAsync方法任务异步回调1. thenRun/thenRunAsync2.thenAccept/thenAcceptAsync3. thenApply/thenApplyAsync4. exceptionally5. whenComplete方法6. handle方法多个任务组合处理AND组合关系OR组合的关系AllOfAnyOfthenCo原创 2022-03-09 23:32:24 · 4402 阅读 · 4 评论 -
实现生产者消费者的三种方式
文章目录wait/notify的消息通知机制预备知识wait/notify消息通知潜在的一些问题notify过早通知等待wait的条件发生变化假死状态wait/notifyAll实现生产者-消费者使用Lock中Condition的await/signalAll实现生产者-消费者使用BlockingQueue实现生产者-消费者生产者-消费者模式是一个十分经典的多线程并发协作的模式,弄懂生产者-消费...原创 2019-10-14 21:25:25 · 13312 阅读 · 15 评论 -
并发工具之Semaphore与Exchanger
文章目录控制资源并发访问Semaphore线程间交换数据的工具Exchanger控制资源并发访问SemaphoreSemaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源。Semaphore就相当于一个许可证,线程需要先通过acquire方法获取该许可证,该线程才能继续往下执行,否则只能在该方法出阻塞等待。当执行完业务功能后,需要通过rel...原创 2019-10-14 21:18:19 · 5372 阅读 · 4 评论 -
并发工具之CountDownLatch与CyclicBarrier
文章目录倒计时器CountDownLatch循环栅栏CyclicBarrierCountDownLatch与CyclicBarrier的比较倒计时器CountDownLatch在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join方法,让主线程等待被join的线程执行完之后,主线程才能继续往下...原创 2019-10-14 21:15:38 · 6772 阅读 · 9 评论 -
原子操作类总结
文章目录原子操作类简介预备知识-CAS操作原子更新基本类型原子更新数组类型原子更新引用类型原子更新字段类型原子操作类简介在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全的目的(关于synchronized可以看这篇文章)。但是由于s...原创 2019-10-14 21:11:56 · 8128 阅读 · 3 评论 -
FutureTask详解
文章目录FutureTask简介FutureTask的基本使用FutureTask简介在Executors框架体系中,FutureTask用来表示可获取结果的异步任务。FutureTask实现了Future接口,FutureTask提供了启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果的一些常用的方法。通过get()方法来获取异步任务的结果,但是会阻塞当前线程直至异步任...原创 2019-10-14 10:02:29 · 6406 阅读 · 4 评论 -
线程池之ScheduledThreadPoolExecutor详解
文章目录ScheduledThreadPoolExecutor简介构造方法特有方法可周期性执行的任务-ScheduledFutureTaskDelayedWorkQueueScheduledThreadPoolExecutor执行过程总结ScheduledThreadPoolExecutor简介ScheduledThreadPoolExecutor可以用来在给定延时后执行异步任务或者周期性执行...原创 2019-10-14 09:58:17 · 11711 阅读 · 6 评论 -
Executors类创建四种常见线程池
文章目录线程池架构newSingleThreadExecutornewFixedThreadPoolnewCachedThreadPoolnewScheduledThreadPoolExecutors和ThreaPoolExecutor创建线程池的区别两种提交任务的方法executesubmit线程池架构上图是线程池的架构图。Java里面线程池的顶级接口是Executor,Executor并...原创 2019-10-14 09:48:26 · 13902 阅读 · 6 评论 -
线程池之ThreadPoolExecutor详解
文章目录为什么要使用线程池线程池详解线程池的创建线程池执行逻辑线程池的关闭线程池的工作原理线程池阻塞队列线程池的饱和策略如何合理配置线程池参数?为什么要使用线程池在实际使用中,线程是很占用系统资源的,如果对线程管理不善很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处:降低资源消耗。通过复用已存在的线程和降低线程关闭的次数来尽可能降低系统...原创 2019-10-14 09:42:10 · 10963 阅读 · 3 评论 -
并发容器之ArrayBlockingQueue与LinkedBlockingQueue详解
文章目录ArrayBlockingQueue简介ArrayBlockingQueue实现原理ArrayBlockingQueue的主要属性put方法详解take方法详解LinkedBlockingQueue实现原理LinkedBlockingQueue的主要属性put方法详解take方法详解ArrayBlockingQueue与LinkedBlockingQueue的比较ArrayBlockin...原创 2019-10-11 19:53:57 · 8001 阅读 · 3 评论 -
并发容器之BlockingQueue详解
文章目录BlockingQueue简介基本操作常用的BlockingQueueBlockingQueue简介在实际编程中,会经常使用到JDK中Collection集合框架中的各种容器类如实现List,Map,Queue接口的容器类,但是这些容器类基本上不是线程安全的,除了使用Collections可以将其转换为线程安全的容器,Doug Lea大师为我们都准备了对应的线程安全的容器,如实现Lis...原创 2019-10-11 19:47:06 · 7202 阅读 · 4 评论 -
ThreadLocal内存泄漏分析与解决方案
文章目录造成内存泄漏的原因?已经做出了哪些改进?cleanSomeSlots方法expungeStaleEntry方法replaceStaleEntry方法为什么使用弱引用?Thread.exit()ThreadLocal最佳实践造成内存泄漏的原因?threadLocal是为了解决对象不能被多线程共享访问的问题,通过threadLocal.set方法将对象实例保存在每个线程自己所拥有的thre...原创 2019-10-11 19:35:23 · 11597 阅读 · 4 评论 -
并发容器之ThreadLocal详解
文章目录ThreadLocal的简介ThreadLocal的实现原理ThreadLocalMap详解Entry数据结构set方法getEntry方法remove方法ThreadLocal的使用场景ThreadLocal的简介在多线程编程中通常解决线程安全的问题我们会利用synchronzed或者lock控制线程对临界区资源的同步顺序从而解决线程安全的问题,但是这种加锁的方式会让未获取到锁的线程...原创 2019-10-11 19:13:20 · 8119 阅读 · 3 评论 -
并发容器之CopyOnWriteArrayList详解
文章目录CopyOnWriteArrayList的简介COW的设计思想CopyOnWriteArrayList的实现原理get方法实现原理add方法实现原理总结CopyOnWriteArrayList的简介Java学习者都清楚ArrayList并不是线程安全的,在读线程在读取ArrayList的时候如果有写线程在写数据的时候,基于fast-fail机制,会抛出ConcurrentModific...原创 2019-10-11 19:04:50 · 9225 阅读 · 7 评论 -
并发容器之ConcurrentLinkedQueue详解与源码分析
文章目录ConcurrentLinkedQueue简介Node操作Node的几个CAS操作offer方法poll方法offer方法中部分线程offer部分线程pollHOPS的设计ConcurrentLinkedQueue简介在单线程编程中我们会经常用到一些集合类,比如ArrayList,HashMap等,但是这些类都不是线程安全的类。在面试中也经常会有一些考点,比如ArrayList不是线程...原创 2019-10-11 18:53:26 · 5923 阅读 · 4 评论 -
并发容器之ConcurrentHashMap详解(JDK1.8版本)与源码分析
文章目录ConcurrentHashMap简介关键属性及类重点方法讲解实例构造器方法initTable方法put方法get方法transfer方法与size相关的一些方法总结ConcurrentHashMap简介在使用HashMap时在多线程情况下扩容会出现CPU接近100%的情况,因为hashmap并不是线程安全的,通常我们可以使用在java体系中古老的hashtable类,该类基本上所有的...原创 2019-10-11 18:38:33 · 10675 阅读 · 7 评论 -
LockSupport详解
文章目录LockSupport简介LockSupport方法介绍一个例子LockSupport简介在之前介绍AQS的底层实现,已经在介绍java中的Lock时,比如ReentrantLock,ReentReadWriteLocks,已经在介绍线程间等待/通知机制使用的Condition时都会调用LockSupport.park()方法和LockSupport.unpark()方法。而这个在同步...原创 2019-10-09 21:13:00 · 6713 阅读 · 2 评论 -
Condition源码分析与等待通知机制
文章目录Condition简介Condition实现原理分析等待队列await实现原理signal/signalAll实现原理await与signal/signalAll的结合思考一个例子Condition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long time...原创 2019-10-09 21:03:52 · 6626 阅读 · 3 评论 -
创建线程的四种方式
创建线程的四种方式继承Thread类实现Runnable接口使用Callable和Future创建线程使用Executor框架创建线程池继承Thread类步骤定义一个Thread类的子类,重写run方法,将相关逻辑实现,run()方法就是线程要执行的业务逻辑方法创建自定义的线程子类对象调用子类实例的star()方法来启动线程public class MyThread e...原创 2019-10-03 21:56:27 · 10949 阅读 · 5 评论 -
进程和线程的区别(超详细)
进程和线程进程一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。线程进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟...原创 2019-10-03 23:34:53 · 378532 阅读 · 42 评论 -
线程的状态和基本操作
在上一篇博客中并发编程的优缺点谈到了为什么花功夫去学习并发编程的技术。万事开头难,接下来就应该了解如何新建一个线程?线程状态是怎样转换的?关于线程状态的操作是怎样的?这篇博客就主要围绕这三个方面来聊一聊。文章目录创建线程的四种方式线程的状态和生命周期线程状态的基本操作interruptedjoinsleepyield进程和线程线程优先级守护线程和用户线程守护线程详解线程死锁认识线程死锁如何避免线...原创 2019-10-03 23:38:44 · 14790 阅读 · 8 评论 -
Java内存模型
Java内存模型(JMM)的介绍在上一篇文章中总结了线程的状态和基本操作,对多线程已经有一点基本的认识了,如果多线程编程只有这么简单,那我们就不必费劲周折的去学习它了。在多线程中稍微不注意就会出现线程安全问题,那么什么是线程安全问题?我的认识是,在多线程下代码执行的结果与预期正确的结果不一致,该代码就是线程不安全的,否则是线程安全的。虽然这种回答似乎不能获取什么内容,可以google下。在<...原创 2019-10-04 15:10:54 · 15775 阅读 · 15 评论 -
重排序与数据依赖性
上一篇博客我们了解了Java内存模型,下面我们来了解一下重排序和数据依赖性的相关知识。为什么需要重排序现在的CPU一般采用流水线来执行指令。一个指令的执行被分成:取指、译码、访存、执行、写回、等若干个阶段。然后,多条指令可以同时存在于流水线中,同时被执行。指令流水线并不是串行的,并不会因为一个耗时很长的指令在“执行”阶段呆很长时间,而导致后续的指令都卡在“执行”之前的阶段上。我们编写的程序都...原创 2019-10-04 15:15:16 · 7691 阅读 · 6 评论 -
as-if-serial规则和happens-before规则的区别
在上一篇博客中,我们知道为了性能优化,我们学习了重排序与数据依赖性。为了在不改变程序执行结果的前提下,尽可能地提高程序执行的并行度,我们需要了解as-if-serial规则和happens-before规则as-if-serial规则as-if-serial语义的意思指:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器,runtime 和处理器都必须...原创 2019-10-04 15:19:48 · 11070 阅读 · 4 评论 -
Java并发理论总结
文章目录JMM的设计happens-before与JMM的关系需要关注的问题在多线程中稍微不注意就会出现线程安全问题,那么什么是线程安全问题?为什么会出现线程安全问题?出现线程安全的问题一般是因为主内存和工作内存数据不一致性和重排序导致的,而解决线程安全的问题最重要的就是理解这两种问题是怎么来的,那么,理解它们的核心在于理解Java内存模型(JMM)。为了性能优化,还会涉及到重排序与数据依赖性...原创 2019-10-04 15:24:27 · 7714 阅读 · 3 评论 -
Java并发关键字-synchronized
文章目录synchronized简介synchronized实现原理对象锁(monitor)机制synchronized的happens-before关系锁获取和锁释放的内存语义synchronized优化CAS操作什么是CAS?CAS的操作过程CAS的应用场景CAS的问题Java对象头偏向锁轻量级锁各种锁的比较一个例子synchronized简介在学习知识前,我们先来看一个现象:publi...原创 2019-10-06 18:34:01 · 14371 阅读 · 5 评论 -
Java并发关键字-volatile
文章目录volatile简介volatile实现原理volatile的happens-before关系volatile的内存语义volatile的内存语义实现一个示例volatile简介在上一篇文章中我们深入理解了Java关键字-synchronized,我们知道在java中还有一大神器就是关键volatile,可以说是和synchronized各领风骚,其中奥妙,我们来共同探讨下。通过上一...原创 2019-10-06 18:42:10 · 9908 阅读 · 8 评论 -
Java并发关键字-final
文章目录final的简介final的具体使用场景变量final成员变量final局部变量方法类final关键字举例多线程中你真的了解final吗final域重排序规则final域为基本类型final域为引用类型final的实现原理为什么final引用不能从构造函数中“溢出”final的简介final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如String类就是一...原创 2019-10-06 18:53:33 · 7899 阅读 · 4 评论 -
Lock简介与初识AQS
文章目录concurrent包的结构层次Lock简介Lock接口API初识AQSAQS的模板方法设计模式一个例子concurrent包的结构层次在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们队并发编程的掌握更加透彻也会大大提升我们队并发编程技术的热爱。这些代码在java.util.concurrent包下。如下图,即为concurren...原创 2019-10-09 20:05:30 · 11807 阅读 · 7 评论 -
AQS(AbstractQueuedSynchronizer)详解与源码分析
文章目录AQS简介同步队列独占锁独占锁的获取(acquire方法)独占锁的释放(release()方法)可中断式获取锁(acquireInterruptibly方法)超时等待式获取锁(tryAcquireNanos()方法)共享锁共享锁的获取(acquireShared()方法)共享锁的释放(releaseShared()方法)可中断(acquireSharedInterruptibly()方法)...原创 2019-10-09 20:24:33 · 10750 阅读 · 9 评论 -
ReentrantLock(重入锁)实现原理与公平锁非公平锁区别
文章目录ReentrantLock的介绍重入性的实现原理公平锁与非公平锁ReentrantLock的介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性(关于synchronized可以看这篇文章),sync...原创 2019-10-09 20:36:55 · 8576 阅读 · 3 评论 -
读写锁ReentrantReadWriteLock源码分析
文章目录读写锁的介绍写锁详解写锁的获取写锁的释放读锁详解读锁的获取读锁的释放锁降级读写锁的介绍在并发场景中用于解决线程安全的问题,我们几乎会高频率的使用到独占式锁,通常使用java提供的关键字synchronized(关于synchronized可以看这篇文章)或者concurrents包中实现了Lock接口的ReentrantLock。它们都是独占式获取锁,也就是在同一时刻只有一个线程能够获...原创 2019-10-09 20:47:26 · 6012 阅读 · 4 评论 -
并发编程的优缺点
并发编程的优缺点Java并发编程是整个Java开发体系中最难以理解,但也是最重要的知识点之一,因此学习起来比较费劲,从而导致很多人望而却步,但是无论是职场面试还是高并发高流量的系统的实现都离不开并发编程,能够真正掌握并发编程的人才在市场上供不应求。为什么要使用并发编程(优点)充分利用多核CPU的计算能力摩尔定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍...原创 2019-10-03 23:34:17 · 22395 阅读 · 12 评论