thread
文章平均质量分 87
老马啸西风
Github: https://github.com/houbb
Email:houbinbin.echo@gmail.com
展开
-
java多线程并发之旅-18-双端队列之 ConcurrentLinkedDeque
问题ConcurrentLinkedDeque 是什么?优缺点?应用场景?源码实现?个人启发?引言在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以...原创 2019-03-29 13:05:23 · 15722 阅读 · 0 评论 -
java多线程并发之旅-35-并发程序的测试
并发程序的测试编写并发程序时候,可以采取和串行程序相同的编程方式。唯一的难点在于,并发程序存在不确定性,这种不确定性会令程序出错的地方远比串行程序多,出现的方式也没有固定规则。这对程序的应用会造成一些困难,那么如何在测试中,尽可能的暴露出这些问题,并且了解其性能瓶颈,这也是对开发者带来新的挑战。本篇基于多线程知识,梳理一些多线程测试需要掌握的方法和原则,以期望可能的在开发阶段,就暴露出并发程序...原创 2019-04-02 15:50:46 · 14634 阅读 · 0 评论 -
java多线程并发之旅-34-性能与可伸缩性
概述编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中存在更多容易出错的地方。那么,为什么还要编写并发程序?线程是Java语言中不可或缺的重要功能,它们能使复杂的异步代码变得更简单,从而极大地简化了复杂系统的开发。此外,要想充分发挥多处理器系统的强大计算能力,最简单的方式就是使用线程。随着处理器数量的持续增长,如何高效地使用并发正变得越来越重要。线程的最主要目...原创 2019-04-02 15:49:52 · 14625 阅读 · 0 评论 -
java多线程并发之旅-33-Dead Lock-死锁
导读是什么?产生的条件?常见的场景?如何发现和分析?如何避免?总结和分析死锁是什么线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需...原创 2019-04-02 15:48:54 · 14254 阅读 · 0 评论 -
java多线程并发之旅-32-线程池的使用
线程池调优的必要性在标准的Executor实现中,当执行需求较低时将回收空闲线程,而当需求增加时将添加新的线程,并且如果从任务中抛出了未检查异常,那么将用一个新的工作者线程替代抛出异常的线程。只有当线程本地值的生命周期受限于任务的生命周期时,在线程池中的线程使用ThreadLocal才有意义,而在线程池的线程中不应该使用ThreadLocal在任务之间传递值。只有当任务都是同类型的并且相互独...原创 2019-04-02 15:47:06 · 14365 阅读 · 0 评论 -
java多线程并发之旅-31-任务的关闭与取消
java 对于终止线程的考虑Java没有提供任何机制来安全地(抢占式方法)终止线程,虽然Thread.stop和suspend等方法提供了这样的机制,但是由于存在着一些严重的缺陷,因此应该避免使用。但它提供了中断Interruption机制,这是一种协作机制,能够使一个线程终止另一个线程的当前工作。一、取消取消操作的原因用户请求取消有时间限制的操作应用程序事件错误...原创 2019-04-02 15:45:39 · 15436 阅读 · 0 评论 -
java多线程并发之旅-30-Executor 总结
jdk8 以后的多线程处理集合进行并行计算有两种方式:并行流和CompletableFutures。并行流计算密集型操作,并且没有I/O,推荐使用Stream接口。因为实现简单,同时效率也可能是最高的(如果所有的线程都是计算密集型的,那就没有必要创建比处理器核数更多的线程);CompletableFutures如果并行的工作单元还涉及等待I/O的操作(包括网络连接等待),那么使用Comp...原创 2019-04-02 15:36:10 · 14150 阅读 · 0 评论 -
java多线程并发之旅-29-Executor CompletableFuture
Future 的不足性能虽然Future以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得到任务的结果。阻塞的方式显然和我们的异步编程的初衷相违背,轮询的方式又会耗费无谓的CPU资源,而且也不能及时地得到计算结果,为什么不能用观察者设计模式当计算结果完成及时通知监听者呢?多个 Future 结果之间的依赖性Future接口可以构建异步应...原创 2019-04-02 15:13:23 · 14359 阅读 · 0 评论 -
java多线程并发之旅-09-java 生产者消费者 Producer/Consumer 模式
生产者消费者模式在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。这个属于基础模式,代码可以参考 轻松学习多线程-06-Producer Consumer 模式缓冲区改良单单抽象出生产者和消费者,还够不上是生产者/消费者模式...原创 2019-03-28 22:51:34 · 15025 阅读 · 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多线程并发之旅-36-读写锁 ReentrantReadWriteLock
ReentrantLock在Java5.0之前,只有synchronized(内置锁)和volatile. Java5.0后引入了显示锁ReentrantLock.ReentrantLock是可重入的锁,它不同于内置锁, 它在每次使用都需要显示的加锁和解锁, 而且提供了更高级的特性:公平锁, 定时锁, 有条件锁, 可轮询锁, 可中断锁. 可以有效避免死锁的活跃性问题.ReentrantLock...原创 2019-04-02 15:52:01 · 14201 阅读 · 0 评论 -
java多线程并发之旅-37-StampedLock 读写锁中的性能之王
layout: posttitle: JCIP-37-StampedLock 读写锁中的性能之王date: 2019-1-18 11:21:15 +0800categories: [Concurrency]tags: [java, concurrency, lock, lock-free, sh]published: trueStampedLockStampedLock实现了不...原创 2019-04-02 15:52:56 · 14372 阅读 · 0 评论 -
java多线程并发之旅-17--双端队列之 LinkedBlockingDeque
问题LinkedBlockingDeque 是什么?优缺点?应用场景?源码实现?个人启发?LinkedBlockingDeque双向并发阻塞队列。所谓双向是指可以从队列的头和尾同时操作,并发只是线程安全的实现,阻塞允许在入队出队不满足条件时挂起线程,这里说的队列是指支持FIFO/FILO实现的链表。要想支持阻塞功能,队列的容量一定是固定的,否则无法在入...原创 2019-03-29 13:04:05 · 14332 阅读 · 0 评论 -
java多线程并发之旅-16-双端队列之 ArrayDeque
ArrayDequeArrayDeque不是线程安全的。ArrayDeque不可以存取null元素,因为系统根据某个位置是否为null来判断元素的存在。当作为栈使用时,性能比Stack好;当作为队列使用时,性能比LinkedList好。特性无容量大小限制,容量按需增长;非线程安全队列,无同步策略,不支持多线程安全访问;当用作栈时,性能优于Stack,当用于队列时,性能优于...原创 2019-03-29 13:03:00 · 15318 阅读 · 0 评论 -
java多线程并发之旅-15-双端队列与工作密取
双端队列Deque 是 Double ended queue (双端队列) 的缩写,读音和 deck 一样,蛋壳。Deque 主要实现类有ArrayDeque 和 LinkedBlockingDeque。使用场景Deque 的实现类主要分为两种场景:一般场景LinkedList 大小可变的链表双端队列,允许元素为 nullArrayDeque 大下可变的数组双端队列,不允许 nu...原创 2019-03-29 13:01:43 · 15118 阅读 · 0 评论 -
java多线程并发之旅-14-lock free queue 无锁队列
无锁队列能实现吗?上面说的加锁的环形队列,可以保证线程安全。但是加锁能不能去掉呢?答案是肯定的,请看下面的娓娓道来。i++ 是原子操作吗?i++和++i是原子操作吗?有一个很多人也许都不是很清楚的问题:i++或++i是一个原子操作吗?在上一节,其实已经提到了,在SMP(对称多处理器)上,即使是单条递减汇编指令,其原子性也是不能保证的。那么在单处理机系统中呢?在编译器对C/C++源代码...原创 2019-03-29 13:00:37 · 15651 阅读 · 0 评论 -
java多线程并发之旅-13-CircleQueue -环形队列
Q是什么?优势?使用场景?无锁队列怎么实现?1.环形队列是什么队列是一种常用的数据结构,这种结构保证了数据是按照“先进先出”的原则进行操作的,即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构,保证了元素也是先进先出的,但与一般队列的区别是,他们是环形的,即队列头部的上个元素是队列尾部,通常是容纳元素数固定的一个闭环。2.环形队列的优点1、 保证元...原创 2019-03-29 12:58:55 · 15510 阅读 · 0 评论 -
java多线程并发之旅-12-二叉堆
Q是什么?有什么用?优势?使用场景?二叉堆二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。示意图如下:二叉堆一般都通过"数组"来实现。数组实现的二叉堆,父节点和子节点的位置存在一定的关系。有时候,我们将"...原创 2019-03-29 12:57:03 · 14113 阅读 · 0 评论 -
java多线程并发之旅-11-优先级队列 Priority Queue
相关学习优先级队列二叉堆堆排序延迟队列Q是什么?怎么用注意事项?源码优先级队列我们知道队列是遵循先进先出(First-In-First-Out)模式的,但有些时候需要在队列中基于优先级处理对象。举个例子,比方说我们有一个每日交易时段生成股票报告的应用程序,需要处理大量数据并且花费很多处理时间。客户向这个应用程序发送请求时,实际上就进入了队列。我们需要首先处...原创 2019-03-29 12:55:09 · 15964 阅读 · 0 评论 -
java多线程并发之旅-10-阻塞队列 BlockingQueue
Q为什么要有阻塞队列?什么是阻塞队列优缺点适用场景实现思想+源码个人启发阻塞队列什么是阻塞队列?阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队...原创 2019-03-29 12:53:58 · 14281 阅读 · 0 评论 -
java多线程并发之旅-38-构建自定义的同步工具 Condition、AQS
导读类库中包含了许多存在状态依赖的类,例如FutureTask、Semaphore和BlockingQueue,他们的一些操作都有前提条件,例如非空,或者任务已完成等。创建状态依赖类的最简单的房就是在JDK提供了的状态依赖类基础上构造。例如第八章的ValueLactch,如果这些不满足,可以使用Java语言或者类库提供的底层机制来构造,包括内置的条件队列conditionA...原创 2019-04-02 15:53:48 · 14237 阅读 · 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多线程并发之旅-22-thread pool 手写线程池
手写线程池本文描述了线程池的核心类。从原理理解线程池线程池的作用降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。代码的实现IPool-线程...原创 2019-03-31 11:37:14 · 14306 阅读 · 0 评论 -
java多线程并发之旅-21-java Thread 创建线程的3种方式对比
Thread示例一、继承Thread类创建线程类(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。(2)创建Thread子类的实例,即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。public class FirstThreadTest extends Thread{ //重写r...原创 2019-03-31 11:36:03 · 14541 阅读 · 1 评论 -
java多线程并发之旅-20-同步工具类。闭锁/栅栏/信号量/阻塞队列/FutureTask
同步工具类同步工具类主要包括闭锁(如CountDownLatch),栅栏(如CyclicBarrier),信号量(如Semaphore)和阻塞队列(如LinkedBlockingQueue)等;FutureTask/Future 也可以达到同样的目的。使用同步工具类可以协调线程的控制流;同步工具类封装了一些状态,这些状态决定线程是继续执行还是等待,此外同步工具类还提供了修改状态的方法;下...原创 2019-03-31 11:34:36 · 14277 阅读 · 0 评论 -
java多线程并发之旅-19-InterruptedException 中断异常处理及中断机制
java 中断机制要知道如何处理,首先要知道 java 的中断机制。引言如果对 Java 中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此。中断机制是如何工作的?捕获或检测到中断后,是抛出 InterruptedException 还是重设中断状态以及在方法中吞掉中断状态会有什么后果?Thread.stop 与中断相比又有哪些异同?什么情况下需要使用中断?...原创 2019-03-31 11:32:51 · 19850 阅读 · 1 评论 -
轻松学习多线程-13-Active Object 模式
目录目录Active Object 模式实际案例定义测试实现方式UML & CodeUMLCode系列导航Active Object 模式Active Object 模式是接受异步消息的主动对象实际案例类信息概览: 类名 说明 Main.java 方法的总入口 MakerClientThr...原创 2018-04-26 20:20:40 · 40535 阅读 · 0 评论 -
轻松学习多线程-12-Thread Special Storage 模式
目录目录Thread Special Storage 模式实际案例定义测试实现方式UML & CodeUMLCode系列导航Thread Special Storage 模式Thread Special Storage 模式是一种即使只有一个入口,也会为每一个线程分配特有的存储空间的模式。实际案例类信息概览: 类名...原创 2018-04-26 20:10:49 · 40674 阅读 · 0 评论 -
轻松学习多线程-11-Two Phase Termination 模式
目录目录Two Phase Termination 模式模式特点实际案例定义测试实现方式UML & CodeUMLCode系列导航Two Phase Termination 模式Two Phase Termination 模式表示先执行完终止处理,再终止线程的模式。模式特点安全的终止线程必定会进行线程终止发出请求后...原创 2018-04-26 19:06:22 · 40708 阅读 · 0 评论 -
轻松学习多线程-10-Future 模式
目录目录future 模式实际案例定义测试实现方式UML & CodeUMLCode系列导航future 模式future 模式类似于一张提货单。future 意思就是未来、期货(金融领域)。实际案例类信息概览: 类名 说明 Main.java 方法的总入口 FutureData.ja...原创 2018-04-26 07:35:29 · 40810 阅读 · 0 评论 -
java多线程并发之旅-23-Executor 框架, ExecutorService, AbstractExecutorService 详解
Q是什么为什么需要有什么优缺点如何使用整个技术体系为什么这么设计?如果是我,我怎么设计?为什么需要 Executornew Thread() 的缺点每次new Thread()耗费性能调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。不利于扩展,比如如定时执行、定期执行、线程中断...原创 2019-03-31 11:39:14 · 14332 阅读 · 0 评论 -
java多线程并发之旅-24-Executor ThreadPoolExecutor 和 Executors 详解
ThreadPoolExecutor线程池相关的处理时 Executor 的核心。可以通过调用Executors以下静态工厂方法来创建线程池并返回一个ExecutorService对象。接口定义继承实现了 AbstractExecutorService。AbstractExecutorService 中定义了一系列对于public class ThreadPoolExecutor ex...原创 2019-03-31 11:40:33 · 14865 阅读 · 0 评论 -
java多线程并发之旅-05-java 设计线程安全的类-实例封闭
问题如何保证一个类是线程安全的?怎么验证?线程安全的类可以成为组件,更加方便的创建线程安全的类吗?线程安全的类有哪些条件在设计线程安全类的过程中,需要包含以下三个基本要素:1、找出构成对象状态的所有变量2、找出约束状态变量的不变性条件3、建立对象状态的并发访问管理策略ps: 一言以蔽之,让所有变量都被对象并发管理。1. 收集同步需求要确保类的线程安全型,就要确保它的...原创 2019-03-28 22:46:58 · 14339 阅读 · 0 评论 -
java多线程并发之旅-04-java 对象发布、不变性、设计线程安全
1 可见性说到底并发还是离不开 JMM 的原理。可以看下我以前整理的 JMM 主内存和工作内存 以及后面的可见性,原子性,有序性。1.1 内存模型主内存:所有线程都可以访问本地内存:每个线程私有的内存java 的所有变量都存储在主内存中每个线程有自己独的工作内存,保存了该线程使用到的变量副本,是对主内存中变量的一份拷贝每个线程不能访问其他线程的工作内存,线程间变量传递需要...原创 2019-03-28 22:45:28 · 14336 阅读 · 0 评论 -
java多线程并发之旅-03-java 线程安全如何保证
1. 线程安全性1.1 概念当多个线程访问某个类时,不管运行时环境采用何种调度方式 或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都能表现正确的行为,那么称这个类时线程安全的。1.2 解决方案多个线程访问可变的变量,导致其值不正确。修复的方式可以从下面的几个方面入手:不在线程之间共享该变量 ThreadLocal + 无状态的类将对象变量设...原创 2019-03-28 22:44:16 · 14555 阅读 · 0 评论 -
java多线程并发之旅-02-java 并发编程的历史
1.并发的发展历史其实,在早期计算机并没有包含操作系统,这个时候,这个计算机只跑一个程序,这个程序独享计算机的所有资源,这个时候不存在什么并发问题,但是对计算机的资源来说,确实是一种浪费。于是,操作系统出现了,操作系统改变了这种现状,让计算机可以运行多个程序,并且不同的程序占用独立的计算机资源,如内存,CPU等。操作系统的出现,主要有以下几点原因:1,资源利用率:可以在其他程序执行过程出现...原创 2019-03-28 22:42:59 · 14415 阅读 · 0 评论 -
java多线程并发之旅-01-多线程并发教程概览
本系列学习目的提升对于 java 多线程的理解,要学会横向对比学习,多看些文章。目前大部分的文章都是止步于创建和常见的类,本系列重在实践,参考书籍《java 并发编程实战》《Java并发编程的艺术》后续原理参考《深入理解并行编程》。对于 java 多线程的基础知识,参考 Java Thread 小结经典书籍《图解 Java 多线程设计模式》 系列学习笔记。对于 jvm 相关知识不用重复...原创 2019-03-28 22:41:07 · 15528 阅读 · 0 评论 -
java多线程并发之旅-28-Executor CompletionService ExecutorCompletionService 详解
CompletionService接口定义了一系列的方法的接口。public interface CompletionService<V> { Future<V> submit(Callable<V> task); Future<V> submit(Runnable task, V result); Fut...原创 2019-03-31 11:46:45 · 15203 阅读 · 0 评论 -
java多线程并发之旅-27-Executor Future FutureTask 详解
Future在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。Future模式可以这样来描述:我有一个任务,提交给了Future,Future...原创 2019-03-31 11:45:30 · 15318 阅读 · 0 评论