Java 并发编程
文章平均质量分 56
潇潇雨歇_
www
展开
-
手写ThreadPoolExecutor线程池
*** 自定义阻塞队列*//** 1.任务队列 *//** 2.锁 *//** 3.生产者条件 *//** 4.消费者条件 *//** 5.队列容量 *//*** 构造方法,指定队列的最大容量*//*** 判断阻塞队列是否已满* @return*//*** 获取队列的容量* @return*/try{}finally {/*** 阻塞获取队列中的任务,获取不到元素会一直阻塞* @return*/try {原创 2023-06-13 10:51:35 · 257 阅读 · 0 评论 -
记一次线上故障--HashMap在多线程条件下运行造成CPU 100%
问题就出现在了while (e != null),从上面的代码看来,每一个线程进来都先执行dataMap = new HashMap();这个时候dataMap是空的,所以在执行下面的操作的时候进入了某一个不可以随意更改状态的代码中,再加上高并发,一直被new HashMap(),while一直被执行,变成了死循环。cpu就瞬间飙升到100%,一直持续到请求数降低的时候。重构问题代码,多线程并发扩容时就会出现环形引用的问题,从.........原创 2022-06-23 15:40:59 · 845 阅读 · 0 评论 -
如何使用多线程优化多查询复杂业务接口,并保证线程安全
介绍:如果一个接口中需要进行多步,而这些业务操作又是各自独立的,传统的依据代码顺序同步执行又比较耗时,传统的优化的空间又比较少,这时就可以考虑使用多线程的方式优化接口,让同步变异步,接口业务操作并行处理,极大提升接口的性能。在线程安全方面,我们可以使用CountDownLatch同步工具类来进行控制。 CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待原创 2021-09-07 10:58:43 · 1055 阅读 · 1 评论 -
Java并发编程---Executors多任务线程框架
一.概念 为了更好地控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效地进行线程控制.他们都在java.util.concurrent包中,是JDK并发包的核心.其中有一个比较重要的类Executors,他扮演这线程工厂的角色,我们通过Executors可以创建特定功能的线程池. Executors创建线程池的方法: new原创 2018-01-07 15:14:42 · 689 阅读 · 0 评论 -
Java并发编程---自定义线程池
一.概念 若Executors工厂类无法满足我们的需求,可以自己去创建自定义的线程池,其实Executors工厂类里面的创建线程方法,其内部实现均是用了ThreadPoolExecutor这个类,这个类可以自定义线程.构造方法如下: public ThreadPoolExecutor(int corePoolSize,原创 2018-01-07 15:18:42 · 429 阅读 · 0 评论 -
Future和Callable的使用总结
在默认的情况下,线程Thread对象不具有返回值的功能,如果在需要取得返回值的情况下是极为不方便的,但在Java1.5的并发包中可以使用Future和Callable来使线程具有返回值的功能。1.Future和Callable的介绍接口Callable与线程功能密不可分,但和Runnable的主要区别为:(1) 接口Callable的call()方法可以有返回值,但Runnable接口...原创 2019-04-04 09:23:09 · 5800 阅读 · 0 评论 -
CompletionService使用总结
接口CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离开来进行处理。使用submit执行任务,使用take取得已完成的任务,并按照完成这些任务的时间顺序处理它们的结果。1.CompletionService介绍接口CompletionService的结构比较简洁,仅有一个实现类ExecutorCompletio...原创 2019-04-04 09:33:28 · 3912 阅读 · 0 评论 -
接口ExecutorService的方法使用总结
1.在ThreadPoolExecutor中使用ExecutorService中的方法方法invokeAny() 和 invokeAll() 具有阻塞特性。方法invokeAny()取得第一个完成任务的结果值,当第一个任务执行完成后,会调用interrupt()方法将其他任务中断,所以在这些任务中可以结合if(Thread.currentThread().isInterrupted() =...原创 2019-04-04 09:58:37 · 1217 阅读 · 0 评论 -
计划任务ScheduledExecutorService的使用总结
Java中的计划任务Timer工具类提供了以计时器或计划任务的功能来实现按指定时间或时间间隔执行任务,但由于Timer工具类并不是以池pool,而是以队列的方式来管理线程的,所以在高并发的情况下运行效率较低,在新版JDK中提供了ScheduledExecutorService对象来解决效率与定时任务的功能。1.ScheduledExecutorService的使用类Scheduled...原创 2019-04-04 10:21:39 · 6442 阅读 · 0 评论 -
Fork-Join分治编程总结(1)
在JDK1.7版本中提供了Fork/Join并行执行任务框架,它的主要作用是把大任务分割成若干个小任务,再对每个小任务得到的结果进行汇总,此种开发方法也叫分治编程,分治编程可以极大地利用CPU资源,提高任务执行的效率,也是目前与多线程有关的前沿技术。在JDK1.7中实现分治编程需要使用ForkJoinPool类,此类的主要作用是创建一个任务池,但其却不能执行具体任务,而要由ForkJoinTask...原创 2019-04-04 13:52:57 · 224 阅读 · 0 评论 -
Fork-Join分治编程总结(2)--类ForkJoinPool核心方法使用总结
1.方法public void execute(ForkJoinTask<?> task)的使用在ForkJoinPool.java类中的execute()方法是以异步的方式执行任务2.方法public void execute(Runnable task)的使用3.方法public void execute(ForkJoinTask<?> task)如何处理返...原创 2019-04-04 14:02:27 · 836 阅读 · 1 评论 -
Redis分布式锁实现并发秒杀商品设计思路
1.何为分布式锁通俗的讲,分布式锁就是说,缓存中存入一个值(key-value),谁拿到这个值谁就可以执行代码。在并发环境下,我们通过锁住当前的库存,来确保数据的一致性。知道信息存入缓存、库存-1之后,我们再重新释放锁。2.分布式锁的设计代码 本案例使用的SpringBoot开发框架2.1 配置文件# tomcat thread = 200server.tomcat...原创 2019-05-13 19:15:07 · 1015 阅读 · 0 评论 -
Java并发编程---生产者-消费者模式
一.概念 生产者和消费者也是一个非常经典的多线程模式,我们在实际开发中应用非常广泛的思想理念.在生产--消费模式中:通常由两类线程,即若干个生产者的线程和若干个消费者的线程.生产者线程负责提交用户请求,消费者线程则负责具体处理生产者提交的任务,在生产者和消费者之间通过共享内存缓冲区进行通信(该模式在MQ中使用比较广泛) 二原创 2018-01-07 15:13:34 · 411 阅读 · 0 评论 -
Java并发编程---Master-Worker模式
一.概念 Master-Worker模式是常用的并行计算模式.它的核心思想是系统由两类进程协作工作:Master进程和Worker进程.Master负责接收和分配任务,Worker负责处理子任务.当各个Worker子进程处理完成后,会将结果返回Master,由Master做归纳和总结.其好处是能将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量.原创 2018-01-05 22:11:46 · 690 阅读 · 0 评论 -
Java并发编程---对象锁的同步和异步
1.概念 1.1 同步:synchronized 同步的概念就是共享,如果不是共享的资源,就没有必要进行同步 1.2 异步:asynchronized 异步的概念就是独立,相互之间不受到任何制约.就好像我们学习http请求的时候,在页面发起的Ajax请求,我们还可以继续操作或浏览页面的内容,二者之间没有任何关系 同步的目的就是为了线程安全原创 2017-12-24 16:55:24 · 522 阅读 · 0 评论 -
Java并发编程---业务数据的脏读问题
1.脏读 概念:对于对象的同步和异步的方法,我们在设计自己的程序时,一定要考虑问题的整体性,不然就会出现数据不一致的错误,很经典的就是脏读问题 2.示例代码package com.thread.objectLock;/** * 业务数据的脏读问题(对象锁的同步与异步知识延伸) * 要求取出的数据要有一致性,即读前和读后 * 避免脏读,要保证加锁的一致性,或原创 2017-12-24 17:43:03 · 793 阅读 · 0 评论 -
Java并发编程---使用wait/notify模拟阻塞Queue
一.BlockingQueue(阻塞Queue) 1.概念 顾名思义,首先它是一个队列,并且支持阻塞的机制,阻塞地放入和得到数据.我们要实现LinkedBlockingQueue下面两个简单的方法put和take put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue没原创 2017-12-30 21:55:09 · 458 阅读 · 0 评论 -
Java并发编程---ThreadLocal和单例模型
一.ThreadLocal 1.概念 线程局部变量,是一种多线程间并发访问变量的解决方案.与其synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全. 从性能上说,ThreadLocal不具备绝对的优势,在并发不是很高的时候,加锁的性能会更好,但作为一套与锁完全原创 2017-12-30 21:55:22 · 656 阅读 · 0 评论 -
Java并发编程---volatile关键字与atomic原子类
一.Volatile关键字 1.1 概念 volatile关键字的主要作用是使变量在多个线程间可见 1.2 示例程序package com.thread.variable;/** * volatile关键字的使用 * @author lhy * @time 2017.12.23 * */public class RunTh原创 2017-12-24 21:47:27 · 1976 阅读 · 0 评论 -
Java并发编程---同步类容器
一.概念 同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护复合操作.复合类操作如:迭代(反复访问元素,遍历完容器中所有的元素),跳转(根据指定的顺序找到当前元素的下一个元素),以及条件运算.这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的便是ConcurrentModifiCationException,原因是当容器迭代的过程中,被并发地修改了原创 2018-01-01 17:28:02 · 300 阅读 · 0 评论 -
Java并发编程---并发类容器(ConcurrentMap容器)
一.背景前奏 jdk5.0以后提供了多种并发类容器来替代同步类容器从而改善性能.同步类容器的状态都是串行化的.他们虽然实现了线程安全.但是严重降低了并发性,在多线程环境时,严重降低了应用程序的吞吐量. 并发类容器是专门针对并发设计的使用ConcurrentHashMap来代替给予散列的传统的HashTable,而且在ConcurrentHashMap中,添加了一些常见复合原创 2018-01-01 17:28:30 · 281 阅读 · 0 评论 -
Java并发编程---并发类容器(CopyOnWrite容器)
一.概念 Copy-On-Write简称COW,是一种用于程序设计中的优化策略.JDK里的COW容器主要有两种:CopyOnWriteArrayList和CopyOnWriteArraySet,COW容器非常有用,可以在非常多的并发场景中使用到. 什么是CopyOnWrite容器? CopyOnWrite容器即写时复制的容器.通俗原创 2018-01-01 17:28:46 · 324 阅读 · 0 评论 -
Java并发编程---线程之间的通信问题
一.线程之间的通信 1.概念 线程是操作系统中独立的个体,但这些如果不经过特殊的处理就不能成为一个整体,线程间的通信就成为整体的必用方式之一.当线程存在通信指挥,系统间的交互性会更强大,在提高CPU利用率的同时还会使开发人员对线程任务在处理的过程中进行有效的把控和监督. 2.代码示例原创 2017-12-26 21:51:48 · 293 阅读 · 0 评论 -
Java并发编程---并发类容器(Queue容器)
一.概念 1.1 并发Queue 在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue 1.2 ConcurrentLinkedQueue(属于Queue队列接原创 2018-01-01 20:19:46 · 431 阅读 · 0 评论 -
Java并发编程---Futrue模式
一.Futrue模式概念 Futrue模式有点类似于商品订单.比如在网购时,当看中某件商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可.或者更形象地,我们发送Ajax请求的时候,页面是异步地进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其他内容. 二.代码示例package com.threa原创 2018-01-05 21:12:17 · 508 阅读 · 0 评论 -
Java并发编程---线程安全问题
1.线程安全的概念 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. synchronized:可以在任意对象或方法上加锁,而加锁的这段代码称为"互斥区"或"临界区" #代码示例:package com.thread.safety;/** * 线程安全小例子:多个线程竞争问题 *原创 2017-12-24 14:50:24 · 363 阅读 · 0 评论