Java 并发之旅
文章平均质量分 91
讲述 Java 并发的爱恨情仇,如歌岁月
老马啸西风
Github: https://github.com/houbb
Email:houbinbin.echo@gmail.com
展开
-
java多线程并发之旅-18-双端队列之 ConcurrentLinkedDeque
问题ConcurrentLinkedDeque 是什么?优缺点?应用场景?源码实现?个人启发?引言在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以...原创 2019-03-29 13:05:23 · 15719 阅读 · 0 评论 -
java多线程并发之旅-17--双端队列之 LinkedBlockingDeque
问题LinkedBlockingDeque 是什么?优缺点?应用场景?源码实现?个人启发?LinkedBlockingDeque双向并发阻塞队列。所谓双向是指可以从队列的头和尾同时操作,并发只是线程安全的实现,阻塞允许在入队出队不满足条件时挂起线程,这里说的队列是指支持FIFO/FILO实现的链表。要想支持阻塞功能,队列的容量一定是固定的,否则无法在入...原创 2019-03-29 13:04:05 · 14329 阅读 · 0 评论 -
java多线程并发之旅-16-双端队列之 ArrayDeque
ArrayDequeArrayDeque不是线程安全的。ArrayDeque不可以存取null元素,因为系统根据某个位置是否为null来判断元素的存在。当作为栈使用时,性能比Stack好;当作为队列使用时,性能比LinkedList好。特性无容量大小限制,容量按需增长;非线程安全队列,无同步策略,不支持多线程安全访问;当用作栈时,性能优于Stack,当用于队列时,性能优于...原创 2019-03-29 13:03:00 · 15309 阅读 · 0 评论 -
java多线程并发之旅-15-双端队列与工作密取
双端队列Deque 是 Double ended queue (双端队列) 的缩写,读音和 deck 一样,蛋壳。Deque 主要实现类有ArrayDeque 和 LinkedBlockingDeque。使用场景Deque 的实现类主要分为两种场景:一般场景LinkedList 大小可变的链表双端队列,允许元素为 nullArrayDeque 大下可变的数组双端队列,不允许 nu...原创 2019-03-29 13:01:43 · 15116 阅读 · 0 评论 -
java多线程并发之旅-14-lock free queue 无锁队列
无锁队列能实现吗?上面说的加锁的环形队列,可以保证线程安全。但是加锁能不能去掉呢?答案是肯定的,请看下面的娓娓道来。i++ 是原子操作吗?i++和++i是原子操作吗?有一个很多人也许都不是很清楚的问题:i++或++i是一个原子操作吗?在上一节,其实已经提到了,在SMP(对称多处理器)上,即使是单条递减汇编指令,其原子性也是不能保证的。那么在单处理机系统中呢?在编译器对C/C++源代码...原创 2019-03-29 13:00:37 · 15648 阅读 · 0 评论 -
java多线程并发之旅-13-CircleQueue -环形队列
Q是什么?优势?使用场景?无锁队列怎么实现?1.环形队列是什么队列是一种常用的数据结构,这种结构保证了数据是按照“先进先出”的原则进行操作的,即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构,保证了元素也是先进先出的,但与一般队列的区别是,他们是环形的,即队列头部的上个元素是队列尾部,通常是容纳元素数固定的一个闭环。2.环形队列的优点1、 保证元...原创 2019-03-29 12:58:55 · 15507 阅读 · 0 评论 -
java多线程并发之旅-12-二叉堆
Q是什么?有什么用?优势?使用场景?二叉堆二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。示意图如下:二叉堆一般都通过"数组"来实现。数组实现的二叉堆,父节点和子节点的位置存在一定的关系。有时候,我们将"...原创 2019-03-29 12:57:03 · 14112 阅读 · 0 评论 -
java多线程并发之旅-11-优先级队列 Priority Queue
相关学习优先级队列二叉堆堆排序延迟队列Q是什么?怎么用注意事项?源码优先级队列我们知道队列是遵循先进先出(First-In-First-Out)模式的,但有些时候需要在队列中基于优先级处理对象。举个例子,比方说我们有一个每日交易时段生成股票报告的应用程序,需要处理大量数据并且花费很多处理时间。客户向这个应用程序发送请求时,实际上就进入了队列。我们需要首先处...原创 2019-03-29 12:55:09 · 15952 阅读 · 0 评论 -
java多线程并发之旅-10-阻塞队列 BlockingQueue
Q为什么要有阻塞队列?什么是阻塞队列优缺点适用场景实现思想+源码个人启发阻塞队列什么是阻塞队列?阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队...原创 2019-03-29 12:53:58 · 14277 阅读 · 0 评论 -
java多线程并发之旅-09-java 生产者消费者 Producer/Consumer 模式
生产者消费者模式在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。这个属于基础模式,代码可以参考 轻松学习多线程-06-Producer Consumer 模式缓冲区改良单单抽象出生产者和消费者,还够不上是生产者/消费者模式...原创 2019-03-28 22:51:34 · 15022 阅读 · 2 评论 -
java多线程并发之旅-08-java CopyOnWriteArrayList 使用入门源码详解
layout: posttitle: JCIP-07-CopyOnWriteArrayList 详解date: 2019-1-18 11:21:15 +0800categories: [Concurrency]tags: [java, concurrency, lock, sh]published: trueexcerpt: JCIP-07-CopyOnWriteArrayLis...原创 2019-03-28 22:50:16 · 14253 阅读 · 0 评论 -
java多线程并发之旅-07-java 线程安全同步容器类
问题为什么需要同步容器类?同步容器类的优点和缺点?对我们设计的启发同步容器类java 中的同步容器在Java中,同步容器主要包括2类:1)Vector、Stack、HashTable2)Collections类中提供的静态工厂方法创建的类Vector实现了List接口,Vector实际上就是一个数组,和ArrayList类似,但是Vector中的方法都是synch...原创 2019-03-28 22:49:07 · 14258 阅读 · 0 评论 -
java多线程并发之旅-06-java 多线程死锁,怎么避免死锁
Java 死锁死锁条件死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。java 死锁产生的四个必要条件:1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。3、请求和保持,即当资源请求者在请求...原创 2019-03-28 22:48:00 · 14565 阅读 · 0 评论 -
java多线程并发之旅-05-java 设计线程安全的类-实例封闭
问题如何保证一个类是线程安全的?怎么验证?线程安全的类可以成为组件,更加方便的创建线程安全的类吗?线程安全的类有哪些条件在设计线程安全类的过程中,需要包含以下三个基本要素:1、找出构成对象状态的所有变量2、找出约束状态变量的不变性条件3、建立对象状态的并发访问管理策略ps: 一言以蔽之,让所有变量都被对象并发管理。1. 收集同步需求要确保类的线程安全型,就要确保它的...原创 2019-03-28 22:46:58 · 14336 阅读 · 0 评论 -
java多线程并发之旅-04-java 对象发布、不变性、设计线程安全
1 可见性说到底并发还是离不开 JMM 的原理。可以看下我以前整理的 JMM 主内存和工作内存 以及后面的可见性,原子性,有序性。1.1 内存模型主内存:所有线程都可以访问本地内存:每个线程私有的内存java 的所有变量都存储在主内存中每个线程有自己独的工作内存,保存了该线程使用到的变量副本,是对主内存中变量的一份拷贝每个线程不能访问其他线程的工作内存,线程间变量传递需要...原创 2019-03-28 22:45:28 · 14334 阅读 · 0 评论 -
java多线程并发之旅-03-java 线程安全如何保证
1. 线程安全性1.1 概念当多个线程访问某个类时,不管运行时环境采用何种调度方式 或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都能表现正确的行为,那么称这个类时线程安全的。1.2 解决方案多个线程访问可变的变量,导致其值不正确。修复的方式可以从下面的几个方面入手:不在线程之间共享该变量 ThreadLocal + 无状态的类将对象变量设...原创 2019-03-28 22:44:16 · 14549 阅读 · 0 评论 -
java多线程并发之旅-02-java 并发编程的历史
1.并发的发展历史其实,在早期计算机并没有包含操作系统,这个时候,这个计算机只跑一个程序,这个程序独享计算机的所有资源,这个时候不存在什么并发问题,但是对计算机的资源来说,确实是一种浪费。于是,操作系统出现了,操作系统改变了这种现状,让计算机可以运行多个程序,并且不同的程序占用独立的计算机资源,如内存,CPU等。操作系统的出现,主要有以下几点原因:1,资源利用率:可以在其他程序执行过程出现...原创 2019-03-28 22:42:59 · 14413 阅读 · 0 评论 -
java多线程并发之旅-01-多线程并发教程概览
本系列学习目的提升对于 java 多线程的理解,要学会横向对比学习,多看些文章。目前大部分的文章都是止步于创建和常见的类,本系列重在实践,参考书籍《java 并发编程实战》《Java并发编程的艺术》后续原理参考《深入理解并行编程》。对于 java 多线程的基础知识,参考 Java Thread 小结经典书籍《图解 Java 多线程设计模式》 系列学习笔记。对于 jvm 相关知识不用重复...原创 2019-03-28 22:41:07 · 15526 阅读 · 0 评论