并发编程
文章平均质量分 95
哈喽羊
这个作者很懒,什么都没留下…
展开
-
【Java并发编程】ThreadPoolExecutor 源码解读
一. 介绍1.1 池化思想在说线程池之前先说下池化思想,池化的出现是为了解决资源管理与资源分配的问题,计算机中,基于池化思想诞生了数据库连接池,内存池等,而线程连接池也是池化思想的产物。我们知道,线程的创建与销毁是需要耗费资源的,所以我们通过线程池对线程做统一的管理,可以达到降低资源消耗,提高响应速度,并提供更多的功能。1.2 类结构我们先来看看ThreadPoolExecutor的一个UML图Executor:接口注释告诉我们,它提供了一种思想,即将任务提交和任务执行进行解耦。用户无需关注原创 2021-01-02 17:01:12 · 431 阅读 · 0 评论 -
【Java并发编程】ReentrantLock 源码解读
一. 介绍上篇文章介绍了Lock接口,这篇文章我们就来看看实现Lock接口的ReentrantLock类二. 属性ReentrantLock只有两个属性 private static final long serialVersionUID = 7373984872572414699L; // 提供了所有实现机制 private final Sync sync;Sync是ReentrantLock的一个内部抽象类,它继承了AQS,而ReentrantLock另外两个内部类:Fai原创 2020-12-27 10:52:15 · 446 阅读 · 0 评论 -
【Java并发编程】Lock与Condition接口
Lock与Condition接口一. 介绍我在《AQS(5)——ConditionObject》这篇文章中曾提过管程这个概念,它能够解决并发编程领域的两大核心问题互斥:同一时刻只能有一个线程访问共享资源同步:线程之间的通信协作而Java在1.5版本之前,是通过synchronized来实现。到了Java 1.5版本,Java大神Doug Lea的又在Java并发包增加了Lock和Condition两接口来解决这两个问题为啥synchronized实现了管程,还要添加这两接口重复实现呢?答案很原创 2020-12-26 23:53:27 · 453 阅读 · 0 评论 -
【Java并发编程】AQS(5)——ConditionObject
这篇文章是AQS系列的最后一篇文章,也是非常重要的一篇,因为这篇文章将引入并发编程中非常重要的一个概念:条件变量。在聊条件变量之前我想先聊聊管程(monitor),下面是对管程的描述:在并发程序中,管程是一种同步结构,它不仅允许线程拥有互斥和等待条件变化的能力,其还可以告诉其他线程条件是否满足。管程是由一个互斥量和多个条件变量构成,一个条件变量实质上是一个等待条件的容器。在再次获得互斥量执行任...原创 2020-04-29 21:31:59 · 1202 阅读 · 3 评论 -
【Java并发编程】AQS(4)——共享锁的获取与释放
今天来说下共享锁的获取与释放,建议大家在看这篇文章之前,先将我写的关于独占锁的文章看一下,其中涉及了许多重复的方法,在这篇文章中就不会再次讲解了。好了,我们先来看共享锁的获取吧一. 共享锁的获取在AQS中共享锁的获取一共有三个方法,今天主要讲第一个 acquireShared:不响应中断获取锁 acquireSharedInterruptibly:响应中...原创 2020-04-10 01:14:57 · 748 阅读 · 8 评论 -
【Java并发编程】AQS(3)——独占锁的释放
今天主要讲AQS中对独占锁的释放,如果大家把昨天“独占锁的获取”看完了,今天这篇文章将会很轻松!AQS在独占模式下,对锁的释放只有release方法,而release方法其实就做了两件事:释放锁和唤醒后继Node(准确讲是Node中的线程,后面为了方便统一称为Node)。下面我们直接看源码吧原创 2020-04-05 17:33:46 · 1426 阅读 · 5 评论 -
【Java并发编程】AQS(2)——独占锁的获取
今天是4月4日,清明节第一天,互联网一片灰白,大家都在缅怀逝者,致敬英烈。所以今天我也没有过多的娱乐,一天都在鼓捣这篇文章。今天这篇主要说说AQS独占锁的获取。AQS中对独占锁的获取一共有三个方法,今天主要说第一个 acquire:不响应中断获取独占锁 acquireInterruptibly:响应中断获取独占锁 tryAcquireNanos:响应中断+超时获...原创 2020-04-04 22:34:58 · 1522 阅读 · 15 评论 -
【Java并发编程】AQS(1)——并发三板斧
自己定的目标不能一开始就垮了啊,明天就放假了,所以赶紧开始更新Java并发编程系列的第一篇文章(准确来说是第二篇,因为前面还写过一篇FutureTask源码解读),也是AQS系列的第一篇文章。其实关于AQS系列的早就写好了,但是一直在反复修改而没有发上来,原因是我希望自己的文章是有信息有价值的。作为一名面向搜索引擎编程的软件工程幼狮,我每天也会接触许多无用信息,所以秉着爱护网络,人人有责的理念,对...原创 2020-04-03 23:52:29 · 922 阅读 · 7 评论 -
【Java并发编程】FutureTask源码解读
最近在学习netty,其中讲到了异步回调,而Netty中的异步回调继承并扩展了JdK中FutureTask相关的API,所以索性又把FutureTask源码看了一遍,看完就觉得两个字:????????!于是决定写篇文章梳理梳理。最近要做的东西太多了,唠嗑概念啥的不多讲了,直接开撕源码吧!一. FutureTask简介我们都知道,Java中生成线程两种最常见的方式是继承Thread,和...原创 2020-03-09 17:06:47 · 566 阅读 · 2 评论 -
Java并发编程——AQS
本文转至 链接太长 ,如果页面失效,请直接关注微信公众号 “小孩子4919 我们都是小青蛙” 查找文章—java并发性能(五)之牛逼的AQS(上)。特此申明! 我们之前都是直接在线程中使用各种同步机制,我们可以把相关的同步问题抽象出来单独定义一些工具,这些工具可以在合适的并发场景下复用,下边我们看如何自定义我们自己的同步工具。设计java的大叔们为了我们方便的自定义各种同步工具,为我们...转载 2018-10-11 11:14:03 · 427 阅读 · 0 评论 -
java并发编程——同步容器
本文转自:https://www.cnblogs.com/dolphin0520/p/3933404.html 特此申明! 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器、并发容器、阻塞队列、Synchronizer(比如CountDownLatch)。今天我们就来讨论下同步容器。 以下是本文的目录大纲: 一.为...转载 2018-08-31 22:11:54 · 167 阅读 · 0 评论 -
java并发编程——join()
先不解释,来看下程序再说public class Demo { public void a(Thread joinThread){ System.out.println("方法a执行了"); joinThread.start(); try { joinThread.join(); } cat...原创 2018-08-30 00:05:08 · 246 阅读 · 0 评论 -
java并发编程——wait、notify、notifyAll和Condition
本文转自:https://www.cnblogs.com/dolphin0520/p/3920385.html 特此申明! 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临...转载 2018-08-29 21:32:10 · 385 阅读 · 0 评论 -
Java并发编程——CountDownLatch、CyclicBarrier和Semaphore
本文转自:https://www.cnblogs.com/dolphin0520/p/3920397.html 特此申明! 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。 以下是本文目录大纲: 零. 概述 一.Cou...转载 2018-08-29 00:30:51 · 209 阅读 · 0 评论 -
java并发编程——锁优化
本博文目录为:一. 线程安全的实现方法二. 锁的优化三. 乐观锁与悲观锁 一. 线程安全的实现方法 1. 互斥同步 互斥同步(Mutual Exclusion & Synchronization)是常见的一种并发正确性保障手段。同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个(或者是一些,使用信号量的时候)...原创 2018-08-23 16:52:37 · 285 阅读 · 0 评论 -
sleep()和 wait()有什么区别?
sleep 就是正在执行的线程主动让出 cpu, cpu 去执行其他线程,在 sleep 指定的时间过后,cpu 才会回到这个线程上继续往下执行,如果当前线程进入了同步锁, sleep 方法并不会释放锁,即使当前线程使用 sleep 方法让出了 cpu,但其他被同步锁挡住了的线程也无法得到执行。 wait 是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁...原创 2018-06-02 09:13:35 · 954 阅读 · 0 评论 -
java 多线程问题 真的提高了效率吗?
从百度知道上看到的关于java多线程问题,提问与回答都很让人受到启发!https://zhidao.baidu.com/question/1673406123438337667.html 提问并行与并发:并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个...转载 2018-04-09 10:35:03 · 1242 阅读 · 0 评论 -
java并发编程——创建线程之Thread 和 Runnable
首先,我们需要了解一些基本知识:微观概念:并行: 指两个或多个事件在同一时刻点发生并发: 指两个或多个事件在同一时间段内发生一、进程(Process)与线程(thread)进程: 运行的应用程序和所占用的资源,是指一个内存中运行的应用程序。每个进程都有自己独立的一个内存空间(数据交互困难),一个应用程序可以同时启动多个进程。比如同时听音乐和看小说 线程:进程中单个任务执行流,...原创 2018-06-02 11:40:54 · 243 阅读 · 0 评论 -
java并发编程——创建线程之匿名内部类与Lambda方式
关于匿名内部类和lambda的基础可以看我博客文章:内部类 , Lambda看完上面链接的两篇文章你就能看懂下面代码了: 1. 匿名内部类的方式 /** *匿名内部类的方式启动线程 */public class T2 { public static void main(String[] args) { new Thread(){ ...原创 2018-08-22 10:49:49 · 3412 阅读 · 0 评论 -
java并发编程——临界区,互斥量,信号量
四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。2、互斥量:为协调共同对一个共享资源的单独访问而设计的。3、信号量:为控制一个具有有限数量用户资源而设计。4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 1.临界区(Critical Section) 保证在某一时刻只有一...原创 2018-08-26 10:14:29 · 2578 阅读 · 0 评论 -
java并发编程——Volatile
本文转自:http://www.cnblogs.com/dolphin0520/p/3920373.html 特此申明! volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽...转载 2018-08-22 15:36:52 · 139 阅读 · 0 评论 -
java并发编程——CAS
1. 乐观锁乐观锁( Optimistic Locking)其实是一种思想。相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。上面提到的乐观锁的概念中其实已经阐述了他的具体实现细节:主要就是两个步骤:冲突检测和数据更新。其实现方式有一种比较典型的就是C...转载 2018-08-26 23:02:16 · 391 阅读 · 0 评论 -
java并发编程——Synchronized
本文转自:https://www.cnblogs.com/dolphin0520/p/3923737.html 特此申明 虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据。今天我们就来一起讨论下线程安全问题,以及Java中提供了什么机制来解决线程安全问题。 以下是本文的目录大纲: 一...转载 2018-08-22 18:12:03 · 146 阅读 · 0 评论 -
java并发编程——Lock
在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。 也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronize...转载 2018-08-22 19:30:11 · 221 阅读 · 0 评论 -
java并发编程——java内存模型
本文转自:https://blog.csdn.net/suifeng3051/article/details/52611310 特此申明还有这篇文章也写得很好:https://blog.csdn.net/dd864140130/article/details/58359102 ----------------------------------------------------...转载 2018-08-22 22:58:37 · 237 阅读 · 0 评论 -
java并发编程——Java线程池 ExecutorService
本篇主要涉及到的是java.util.concurrent包中的ExecutorService。ExecutorService就是Java中对线程池的实现。一、ExecutorService介绍ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法: Java API对Execut...转载 2018-08-23 10:56:10 · 14942 阅读 · 4 评论 -
java并发编程——Callable、Future 和 FutureTask
本文转自:https://www.cnblogs.com/dolphin0520/p/3949310.html 特此申明! 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦...转载 2018-08-23 10:50:07 · 161 阅读 · 0 评论 -
java并发编程——Java线程池 ThreadPoolExecutor、ScheduledThreadPoolExecutor 和 Executors工厂
Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService。利用这两个类,可以创建各种不同的Java线程池,为了方便我们创建线程池,Java API提供了Executors工厂类来帮助我们创建各种各样的线程池。下面我们分别介绍一下这三个类。 一、Thread...转载 2018-08-23 13:34:54 · 244 阅读 · 0 评论 -
java并发编程——创建线程之线程池
一,线程池的概念 线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。 在java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,创建和销毁线程花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程...原创 2018-06-02 20:17:34 · 320 阅读 · 0 评论