并发编程
Java多线程
烟雨星空
公众号:「烟雨星空」,关注免费领取1000G学习资料
展开
-
ReentrantReadWriteLock 源码分析以及 AQS 共享锁 (二)
前言上一篇讲解了 AQS 的独占锁部分(参看:ReentrantLock 源码分析以及 AQS (一)),这一篇将介绍 AQS 的共享锁,以及基于共享锁实现读写锁分离的 ReentrantReadWriteLock。(若是遇到之前讲过的方法,将不再赘述)先思考一下,为什么我们用读写锁分离?我们知道 ReentrantLock 用的是独占锁,不管线程是读还是写状态,都会阻塞,这无疑会降低并发量...原创 2020-03-17 20:45:07 · 1017 阅读 · 1 评论 -
面试官问我:创建线程有几种方式?我笑了
前言多线程在面试中基本上已经是必问项了,面试官通常会从简单的问题开始发问,然后再一步一步的挖掘你的知识面。比如,从线程是什么开始,线程和进程的区别,创建线程有几种方式,线程有几种状态,等等。接下来自然就会引出线程池,Lock,Synchronized,JUC的各种并发包。然后就会引出 AQS、CAS、JMM、JVM等偏底层原理,一环扣一环。这一节我们不聊其他的,只说创建线程有几种方式。是不是感觉非常简单,不就是那个啥啥那几种么。其实不然,只有我们给面试官解释清楚了,并加上我们自己的理解,才能在面原创 2020-10-24 13:46:32 · 1641 阅读 · 3 评论 -
ReentrantLock 源码分析以及 AQS (一)
前言JDK1.5 之后发布了JUC(java.util.concurrent),用于解决多线程并发问题。AQS 是一个特别重要的同步框架,很多同步类都借助于 AQS 实现了对线程同步状态的管理。AQS 中最主要的就是独占锁和共享锁的获取和释放,以及提供了一些可中断的获取锁,超时等待锁等方法。ReentranLock 是基于 AQS 独占锁的一个实现。ReentrantReadWriteLoc...原创 2020-03-13 21:46:12 · 1250 阅读 · 3 评论 -
终于有人把 CountDownLatch,CyclicBarrier,Semaphore 讲明白了!
在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别。一、CountDownLatch先看一下,CountDownLatch 源码的官方介绍。意思是,它是一个同步辅助器,允许一个或多个线程一直等待,直到一组在其他线程执行的操作全部完成。public CountDownLa...原创 2020-03-06 18:00:19 · 633 阅读 · 0 评论 -
常用阻塞队列 BlockingQueue 有哪些?
为什么要使用阻塞队列之前,介绍了一下 ThreadPoolExecutor 的各参数的含义(并发编程之线程池ThreadPoolExecutor),其中有一个 BlockingQueue,它是一个阻塞队列。那么,小伙伴们有没有想过,为什么此处的线程池要用阻塞队列呢?我们知道队列是先进先出的。当放入一个元素的时候,会放在队列的末尾,取出元素的时候,会从队头取。那么,当队列为空或者队列满的时候怎么...原创 2020-03-04 23:30:06 · 837 阅读 · 0 评论 -
面试官让我手写一个生产者消费者模式
不知道你是否遇到过面试官让你手写生产者消费者代码。别说,前段时间有小伙伴还真的遇到了这种情况。当时是一脸懵逼。但是,俗话说,从哪里跌倒就要从哪里爬起来。既然这次被问到了,那就回去好好研究一下,争取下一次不再被虐呗。于是,今天我决定手敲一个生产者消费者模式压压惊。(因为我也不想以后被面试官血虐啊)生产者消费者模式,其实很简单。无非就是生产者不停的生产数据,消费者不停的消费数据。(这不废话吗,字...原创 2020-02-25 22:58:25 · 1714 阅读 · 0 评论 -
怎么用wait、notify巧妙的设计一个Future模式?
我们知道多线程可以实现同时执行多个任务(只是看起来是同时,其实是CPU的时间片切换特别快我们没感觉而已)。现在假设一个做饭的场景,你没有厨具也没有食材。你可以去网上买一个厨具,但是这段时间,你不需要闲着啊,可以同时去超市买食材。设想这是两个线程,主线程去买食材,然后开启一个子线程去买厨具。但是,子线程是需要返回一个厨具的。 如果用普通的线程,只有一个Run方法,而Run方法是没有返回值的,这个...原创 2020-02-23 21:15:18 · 1434 阅读 · 0 评论 -
并发编程之Master-Worker模式
我们知道,单个线程计算是串行的,只有等上一个任务结束之后,才能执行下一个任务,所以执行效率是比较低的。那么,如果用多线程执行任务,就可以在单位时间内执行更多的任务,而Master-Worker就是多线程并行计算的一种实现方式。它的思想是,启动两个进程协同工作:Master和Worker进程。Master负责任务的接收和分配,Worker负责具体的子任务执行。每个Worker执行完任务之后把结...原创 2020-02-21 14:04:51 · 1131 阅读 · 0 评论 -
线程中断 interrupt 和 LockSupport
本文章将要介绍的内容有以下几点,读者朋友也可先自行思考一下相关问题:线程中断 interrupt 方法怎么理解,意思就是线程中断了吗?那当前线程还能继续执行吗?判断线程是否中断的方法有几个,它们之间有什么区别?LockSupport的 park/unpark 和 wait/notify 有什么区别?sleep 方法是怎么响应中断的?park 方法又是怎么响应中断的?线程中断相关方法...原创 2020-03-01 22:47:50 · 897 阅读 · 1 评论 -
线程sleep,wait,notify,join,yield方法解析
线程的五种状态线程从创建到销毁一般分为五种状态,如下图:1) 新建当用new关键字创建一个线程时,就是新建状态。2) 就绪调用了 start 方法之后,线程就进入了就绪阶段。此时,线程不会立即执行run方法,需要等待获取CPU资源。3) 运行当线程获得CPU时间片后,就会进入运行状态,开始执行run方法。4) 阻塞当遇到以下几种情况,线程会从运行状态进入到阻塞状态。调用sl...原创 2020-02-29 22:28:26 · 1487 阅读 · 0 评论 -
并发编程之线程池ThreadPoolExecutor
前言在我们平时自己写线程的测试demo时,一般都是用new Thread的方式来创建线程。但是,我们知道创建线程对象,就会在内存中开辟空间,而线程中的任务执行完毕之后,就会销毁。单个线程的话还好,如果线程的并发数量上来之后,就会频繁的创建和销毁对象。这样,势必会消耗大量的系统资源,进而影响执行效率。所以,线程池就应运而生。线程池ThreadPoolExecutor可以通过idea先看下线...原创 2020-02-27 23:15:13 · 1068 阅读 · 0 评论