多线程并发
文章平均质量分 87
Danny_idea
热爱技术,热爱生活,一步一个脚印。
更多宝贵知识记录可以关注个人公众号:Idea的技术分享
展开
-
线程池的经典应用场景
在日常的开发工作中,我们经常会需要使用到线程池这类型的组件。例如下边几种应用场景:线程池经典应用场景异步发送邮件通知发送一个任务,然后注入到线程池中异步发送。心跳请求任务创建一个任务,然后定时发送请求到线程池中。类似的场景有很多,我们下边一步一步地来介绍不同的应用场景下,线程池的具体使用案例:异步发送邮件场景定义一个简单的邮件发送接口:public interface SendEmailService { /** * 发送邮件 * * @param e原创 2021-10-19 10:11:07 · 12566 阅读 · 4 评论 -
CompletableFuture实战--优化性能提升
CompletableFuture相比于jdk5所提出的future概念,future在执行的时候支持异步处理,但是在回调的过程中依旧是难免会遇到需要等待的情况。在jdk8里面,出现了CompletableFuture的新概念,支持对于异步处理完成任务之后自行处理数据。当发生异常的时候也能按照自定义的逻辑来处理。如何通过使用CompletableFuture提升查询的性能的问题呢?下边我举...原创 2020-02-23 21:48:48 · 1792 阅读 · 2 评论 -
多线程里面的设计模式
今晚总结一下关于开发中常用的多线程设计模式。Future设计模式future相信大家对这个东西都不陌生,那么我们就开门见山的来讲吧。首先来思考几个问题future是用来做什么的?当我们做一些计算机串行化计算的时候,在等待响应的过程中,接收方的线程是处于堵塞状态的,比较浪费资源。这个时候如果采用future来帮我们异步接收参数,避免同步等待的问题,那么这种方式我们称之为future。f...原创 2020-02-23 21:40:02 · 492 阅读 · 0 评论 -
java并发编程的艺术(9)多线程之间的通信
关于多线程的状态切换过程中,线程的状态会有多种的切换,在早期的jdk版本中,线程之间的切换主要是通过join,sleep,wait,notify,notifyall等系列的函数来进行状态变迁的。线程之间的切换状态如下图所示:线程共包括以下5种状态。1.新建状态(New)线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2...原创 2019-03-21 23:44:26 · 267 阅读 · 0 评论 -
java并发编程的艺术(8)深入解析ConcurrentHashMap
转载自:https://www.cnblogs.com/wuzhitong/p/8492228.html以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同...转载 2019-02-04 15:23:55 · 254 阅读 · 2 评论 -
java并发编程的艺术(7)LockSupport
关于LockSupport工具类的使用在阅读aqs源码的时候,经常会看到使用了LockSupport工具类,这个工具类里面提供了两个用于堵塞现线程和解除线程堵塞的接口:parkunpark核心源码:private static void setBlocker(Thread t, Object arg) { // Even though volatile, hotspot does...原创 2019-02-04 10:08:52 · 217 阅读 · 0 评论 -
java并发编程的艺术(6)深入挖掘aqs独占锁源码
并发编程里面的很多常用的类,例如ReentrantLock,Semaphore,CountDownLatch实际上底层都是通过使用AbstractQueuedSynchronizer(AQS)来进行实现的。那么今天我们就来仔细聊聊AQS这样东西。底层的核心主要是维护一个volatile int waitStatus的状态值,以及一个FIFO线程等待队列。对于waitStatus变量,AQS里面提...原创 2019-01-28 16:16:45 · 197 阅读 · 0 评论 -
java并发编程的艺术(5)CountDownLatch笔记
什么是CountDownLatch?这是一种可以使得某个线程等待其他线程完成各自工作之后,同步执行的一个工具类。原理:通过一个计数器,初始值为所有线程的数量,当线程开启之后,数值减少1,当数值为0的时候,表示所有线程已经完成任务。CountDownLatch如何工作构造器中的计数值(count)实际上就是闭锁需要等待的线程数量。这个值只能被设置一次,而且CountDownLatch没有...原创 2019-01-28 16:12:58 · 359 阅读 · 0 评论 -
java并发编程的艺术(4)CAS笔记
CAS(Compare And Swap )在java里面的锁,我们经常会谈起一些乐观锁和悲观锁。其实两者的区别主要就在于对数据加锁的时候是采取乐观的策略还是悲观的策略罢了。但是由于每一次加锁的时候,实际上都会在访问共享资源时发生冲突,线程需要进行等待锁的解开。而cas技术主要是一种无锁的机制,采用cas技术可以保证线程之间的安全性。在常说的cas里面有我们常说的几个关键概念:执行函数:...原创 2019-01-28 16:09:27 · 287 阅读 · 0 评论 -
java并发编程的艺术(3)各种锁的机制
转载自:https://www.cnblogs.com/aspirant/p/6930436.html如果需要查看具体的synchronized和lock的实现原理,请参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度)在并发编程中,经常遇到多个线程访问同一个 共享资源 ,这时候作为开发者必须考虑如何维护数据一致性,在java中synchronized关...转载 2019-01-28 15:47:05 · 238 阅读 · 0 评论 -
java并发编程的艺术(2)浅谈volatile和synchronized
再多线程编程里面,难免避免不了volatile和synchronized这两个关键字。关于volatile这个关键字,最著名的就是“可见性”问题了,所谓的可见性问题是指:当有多个线程访问同一个共享变量,并且对这个变量进行修改之后,另外的一个线程里面可以读取到这个最新修改的值。关于volatile的定义和原理Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共...原创 2018-07-14 18:27:47 · 230 阅读 · 0 评论 -
java并发编程的艺术(1)并发编程的挑战
在常见的多线程编程里面,我们总是希望创建多个线程来让程序的运行速度更加快速。但是,并不是启动更加多的线程就可以让程序运行地更加快速了。例如说当出现了上下文切换的情况和死锁的情况。因此下边小编会编写一些典型的案例来说明并发和串行的效率区别。上下文切换: 使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,...原创 2018-07-14 14:26:59 · 287 阅读 · 0 评论 -
重复造轮子(2) --自定义独占锁
最近刚刚通过了某大型游戏公司的技术面试,在和面试官交流中,主要都是谈及一些关于多线程开发中的锁原理。在以前的常规开发中,对于加锁操作而言经常会出现在多线程开发当中,所以对于锁的原理机制有必要花时间理一下,于是今晚写了这一篇文章。队列同步器AbstractQueuedSynchronizer(AQS),这个东西似乎我们不经常用,但是它是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员...原创 2018-07-13 12:17:10 · 224 阅读 · 0 评论