
Java 并发
文章平均质量分 98
Java Concurrent包一些源码分析,类使用,并发相关知识
小哥骑单车
Nobody can go back and start a new begining, but anyone can start today and make a new ending.
展开
-
AbstractQueuedSynchronizer详解(一)同步器分析
目录1、下面讲几个多线程方面的概念:(1)、临界资源:(2)、阻塞的定义(3)、临界区(4)、同步器(5)、上述同步器的特点:(6)、如果需要实现一个同步器,他需要具备哪些特点:(7)、jkd中同步器就是使用AbstractQueuedSynchronizer来实现(8)、AQS的组件(9)、公平方式:2、AQS相关概念:3、队列同步器接...原创 2019-07-24 11:20:51 · 1581 阅读 · 0 评论 -
Java线程池 ThreadPoolExecutor详解(一) -- 基于JDK1.8
目录1、为什么需要线程池?(1)、线程池好处是:2、Executors常用线程池种类(1)、通过Executors工具类可以创建哪几种类型线程池a、newFixedThreadPool(nThreads)b、 newCachedThreadPool()c、newScheduledThreadPool(corePoolSize)d、newSingleThread...原创 2019-08-21 13:39:20 · 3263 阅读 · 0 评论 -
阻塞队列详解 LinkedBlockingQueue 源码分析 -- 基于JDK 1.8
在上一篇我们介绍了ArrayBlockingQueue 源码分析 -- 基于JDK 1.8后,还有这个兄弟阻塞队列类,也顺便一起分析了吧。跟上一篇有很多相似的代码地方,我们在这里没有重复叙述,所以可以先看一下ArrayBlockingQueue的介绍。目录1、LinkedBlockingQueue继承结构2、类中的属性3、插入元素方法(1)非阻塞add(offer)方法...原创 2019-08-01 21:25:32 · 3422 阅读 · 0 评论 -
非阻塞队列详解 ConcurrentLinkedQueue详解 源码分析 -- 基于JDK 1.8
上一篇,我们分析了阻塞队列的内容:阻塞队列详解 LinkedBlockingQueue 源码分析 -- 基于JDK 1.8现在来看一下非阻塞队列:要实现一个线程安全的队列有两种方式:阻塞和非阻塞。前面我们分析了阻塞队列LinkedBlockingQueue和ArrayBlockingQueue, 阻塞队列本质就是锁Reentrantlock和条件Condition等待唤醒操作的结合应用,...原创 2019-08-05 09:09:12 · 3627 阅读 · 5 评论 -
阻塞队列详解 ArrayBlockingQueue 源码分析 -- 基于JDK 1.8
阻塞队列产生前景:在实际应用场景中,多生产者、多消费者模式,如果我们自己构造一个FIFO先进先出队列,在多线程从队列存取数据的时候,需要操作一些临界资源,我们不仅要考虑加锁的情况,还要考虑队列是否满了,满了就要wait直到队列不满的时候再往里面存,并且唤醒notify取元素线程,相反,队列空了就wait直到队列不空的时候再从里面取,唤醒notify存元素线程;一但操作不当,容易造成阻塞唤醒问题,容...原创 2019-07-31 21:21:59 · 1391 阅读 · 0 评论 -
《Java并发编程的艺术》 读书笔记 之 Java内存模型(九)Java内存模型综述
《Java并发编程的艺术》 读书笔记: - - 原作者:方腾飞Java内存模型综述前面对Java内存模型的基础知识和内存模型的具体实现进行了说明。下面对Java内存模型的相关知识做一个总结。(1)、处理器的内存模型顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会以顺序一致性内存模型为参照。在设计时,JMM和处理器内存模型会对顺序一致性模型做一些放松,因为...原创 2019-07-25 14:38:17 · 1484 阅读 · 0 评论 -
《Java并发编程的艺术》 读书笔记 之 Java内存模型(八)双重检查锁定与延迟初始化
《Java并发编程的艺术》 读书笔记: - - 原作者:方腾飞在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延迟初始化技术,但它是一个错误的用法。本文将分析双重检查锁定的错误根源,以及两种线程安全的延迟初始化方案。(1)、双重检查锁定的由来双重检查锁定的由来在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且...原创 2019-07-25 14:35:36 · 1244 阅读 · 0 评论 -
《Java并发编程的艺术》 读书笔记 之 Java内存模型(七)happens-before
《Java并发编程的艺术》 读书笔记: - - 原作者:方腾飞happens-beforehappens-before是JMM最核心的概念。对应Java程序员来说,理解happens-before是理解JMM的关键。(1)、JMM的设计首先,让我们来看JMM的设计意图。从JMM设计者的角度,在设计JMM时,需要考虑两个关键因素。·程序员对内存模型的使用。程序员希望内存模...原创 2019-07-25 14:29:29 · 1397 阅读 · 0 评论 -
《Java并发编程的艺术》 读书笔记 之 Java内存模型(六)final域的内存语义
《Java并发编程的艺术》 读书笔记: - - 原作者:方腾飞final域的内存语义与前面介绍的锁和volatile相比,对final域的读和写更像是普通的变量访问。下面将介绍final域的内存语义。(1)、final域的重排序规则对于final域,编译器和处理器要遵守两个重排序规则。1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变...原创 2019-07-25 14:26:54 · 1333 阅读 · 0 评论 -
《Java并发编程的艺术》 读书笔记 之 Java内存模型(五)锁的内存语义
《Java并发编程的艺术》 读书笔记: - - 原作者:方腾飞锁的内存语义众所周知,锁可以让临界区互斥执行。这里将介绍锁的另一个同样重要,但常常被忽视的功能:锁的内存语义。(1)、锁的释放-获取建立的happens-before关系锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放-获取的示例...原创 2019-07-25 14:23:56 · 900 阅读 · 0 评论 -
AbstractQueuedSynchronizer详解(二)同步器 与 ReentrantLock源码详细分析
上一篇我们讲了AbstractQueuedSynchronizer(一)的大致流程:AbstractQueuedSynchronizer详解(一)同步器分析现在来看一下ReentrantLock与他相关的详细源码分析:目录1、同步器类属性字段: 2、同步队列Node对象属性3、获取ReentrantLock独占非公平锁(1)、Reentr...原创 2019-07-24 11:36:56 · 3613 阅读 · 0 评论 -
AbstractQueuedSynchronizer详解(三)同步器 之 Condition原理分析
之前我们讲了AQS的大致流程:AbstractQueuedSynchronizer详解(一)同步器分析和源码:AbstractQueuedSynchronizer详解(二)同步器 与 ReentrantLock源码详细分析现在讲一下并不经常关注的Condition队列;以下内容参考来自《Java并发编程的艺术》-方腾飞目录(1)、等待队列(2)、...转载 2019-07-24 11:44:34 · 1258 阅读 · 0 评论 -
ConcurrentHashMap详解 jdk1.8源码分析
上一篇:HashMap源码详解分析,基于jdk1.8ConcurrentHashMap jdk1.7简介和 jdk1.8源码分析目录一、ConcurrentHashMap,jdk1.7简介1、ConcurrentHashMap产生背景2、ConcurrentHashMap 1.7版本采用分段锁的简介:3、put存元素操作时候4、JDK1.7版本的Con...原创 2019-07-21 20:31:10 · 4078 阅读 · 0 评论 -
《Java并发编程的艺术》 读书笔记 之 Java内存模型(一)Java内存模型的基础
《Java并发编程的艺术》 读书笔记: - - 原作者:方腾飞1、Java内存模型的基础(1)、并发编程模型的两个关键问题在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共...原创 2019-07-25 14:03:58 · 931 阅读 · 0 评论 -
《Java并发编程的艺术》 读书笔记 之 Java内存模型(二)重排序
《Java并发编程的艺术》 读书笔记: - - 原作者:方腾飞目录(1)、数据依赖性(2)、as-if-serial语义(3)、程序顺序规则(4)、重排序对多线程的影响重排序重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。(1)、数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。...原创 2019-07-25 14:09:25 · 3405 阅读 · 0 评论 -
《Java并发编程的艺术》 读书笔记 之 Java内存模型(三)顺序一致性
《Java并发编程的艺术》 读书笔记: - - 原作者:方腾飞顺序一致性内存模型是一个理论参考模型,在设计的时候,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照。(1)、 数据竞争与顺序一致性当程序未正确同步时,就可能会存在数据竞争。Java内存模型规范对数据竞争的定义如下。在一个线程中写一个变量,在另一个线程读同一个变量,而且写和读没有通过同步来排序...原创 2019-07-25 14:12:36 · 856 阅读 · 0 评论 -
《Java并发编程的艺术》 读书笔记 之 Java内存模型(四)volatile的内存语义
《Java并发编程的艺术》 读书笔记: - - 原作者:方腾飞当声明共享变量为volatile后,对这个变量的读/写将会很特别。为了揭开volatile的神秘面纱,下面将介绍volatile的内存语义及volatile内存语义的实现。(1)、volatile特性理解volatile特性的一个好方法是把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了...原创 2019-07-25 14:17:47 · 1338 阅读 · 0 评论 -
Java线程池 ThreadPoolExecutor详解 (二) -- 基于JDK1.8
之前在第一篇文章介绍了线程池的一些整体知识:Java线程池ThreadPoolExecutor详解(一) --基于JDK1.8现在我们来分析一下源码:目录1、类属性变量(1)、全局变量a、线程池基本变量属性b、线程池状态字段属性c、线程池其它重要意义字段(2)、构造方法a、常用构造方法源码:b、构造方法参数解析:(3)、Worker对象2...原创 2019-08-27 10:11:16 · 2562 阅读 · 0 评论 -
并发容器 CopyOnWriteArrayList 基于JDK 1.8
CopyOnWriteArrayList简介CopyOnWriteArrayList是ArrayList的线程安全版本实现,他的名字告诉了我们,说明是在写的时候复制;其中所有变更元素操作,add 、set 、remove等,都需要新建一个数组,来存放新元素,这通常成本太高;在修改数据的时候,首先加锁Reentrantlock,然后复制得到一个新数组,在这个新数组上做修改,最后再将...原创 2019-08-05 09:26:26 · 994 阅读 · 0 评论 -
Callable和Future详解 – 基于JDK 1.8
目录1、多线程的实现方式2、第三种创建线程方式3、执行任务Demo4、应用场景1、多线程的实现方式在JDK1.5以前,多线程的两种创建方式,实现Runnable接口,或者继承Thread类;其中Thread类也是实现了Runnable接口;重写run方法,完成多线程要执行的内容;如下源码可以看到,run方法可以执行完成任务,但是方法返回确实void类型;class T...原创 2019-08-08 16:53:50 · 3304 阅读 · 0 评论 -
Fork/Join框架详解 -- 基于JDK1.8
目录1、Fork/Join简介(1)产生背景(2)Fork/Join结构:2、实例Demo:3、原理及应用场景1、Fork/Join简介(1)产生背景摩尔定律(百度百科):摩尔定律是由英特尔(Intel)创始人之一戈登·摩尔(Gordon Moore)提出来的。其内容为:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能...原创 2019-08-14 20:45:19 · 1208 阅读 · 0 评论 -
FutureTask详解 –源码分析– 基于JDK 1.8
在之前我们已经了解Future的使用:Callable和Future详解 – 基于JDK 1.8现在来看一下Future的唯一实现类FutureTask的内部原理分析吧;目录1、类的结构(1)、继承关系:2、类中属性与方法(1)、各种状态值(2)、其它属性(3)、构造方法(4)、大致实现思路(5)、Runnable接口实现(6)、阻塞获取执行结...原创 2019-08-10 23:10:56 · 2833 阅读 · 0 评论 -
并行与并发的区别
转载自:https://www.cnblogs.com/goloving/p/9391074.html很多人不是特别明白并发编程和并行编程的区别所在,有很多人很容易搞混淆,觉得二者近似相等,本文将用几个浅显易懂的例子,来说明一下什么是并发和并行。1、任务与多任务 关于什么是进程,什么是线程,这里不打算多说,关于每一种开发语言的多线程处理技术语法上有所区别,原理很多类似,可以...转载 2019-08-11 17:41:19 · 695 阅读 · 0 评论