
多线程与并发
hello_读书就是赚钱
2020年12月加入某头部互联网公司,担任高级开发工程师,从事公司核心软件开发/
2017年6月加入某1000人+软件公司,担任中级架构师从事公司核心软件项目开发,分布式架构研究、部署,生产环境维护等工作
展开
-
经典笔试题:3个线程连续打印XYZ
编写代码,使用3个线程,1个线程打印X,一个线程打印Y,一个线程打印Z,同时执行连续打印10次"XYZ"昨天试了一下这个题目,自己的思路用的是同步队列做信号量的传递。(后面看了网上别人的一些想法是用的volatile,实际可以,用的内存更少,昨晚本来第一个思路也是,后面有点卡了就放弃了,想到用队列更加优雅,现在复盘一下思路)线程一跑完线程二跑线程二跑完线程三跑线程三跑完线程一跑需要一个通知的机制,用同步队列做通知,等待的时候用take等待,允许下一个流程的时候传递一个Object作为信号量.原创 2020-10-13 16:12:58 · 450 阅读 · 0 评论 -
一头扎进多线程-构建高效且可伸缩的结果缓存
通过多线程的所有组件学习之后,我们要学习到如何把一个类包装成一个多线程安全类,下面通过构造一个——计算缓存类,在构造的过程中一步一步的优化,最终来得到我们想要的计算缓存类。类提供的功能:类提供一个计算的功能,然后把计算传入的值与结果缓存在一个Map中,当第二次计算时先从缓存里面查看看曾经有没有计算过,有的话就直接返回结果,没有的话就进行计算,存到缓存再返回结果。菜鸟的做法如果是我的话,首先我会这么做原创 2016-12-09 16:07:38 · 504 阅读 · 0 评论 -
一心多用多线程-细谈java线程池submit与execute的区别
深夜学习,发现ThreadPoolExecutor里面一个小知识点,故开热点连wifi怒写submit与execute方法的区别。1.问题的来源在看书的时候,涉及到java线程池问题的时候常常面临这样一个问题。当定义了一个Runnable对象想提交到线程池里面总是会看到不同的提交方法,产生的尬题如下:public class ThreadPoolDemo { public static cl原创 2016-11-24 01:56:28 · 35066 阅读 · 10 评论 -
一心多用多线程-阻塞队列(5)-CountDownLatch
五、倒数执行机制-CountDownLatch Latch:门闩的意思。根据该类名的意思,我们就可以知道该类在多线中扮演的就是一个倒数门闩的角色,怎么理解呢? 首先呢,我们新建一个CountDownLacth对象时我们需要给他传一个int参数,这个参数代表它将倒数的次数,也就是说调用几次countDown方法后,他就会对线程放行。 那放行是什么意思呢,就是某一个线程在执行的过程中如果遇到Cou原创 2016-11-04 17:34:33 · 849 阅读 · 0 评论 -
一心多用多线程-线程池ThreadPoolExecutor-看这篇就够了
许久之前理解了java线程池ThreadPoolExecutor,今天来做一个总结,根据java api加上自己的理解,让我们能更透彻的理解java线程池首先先写一下线程池的概念: 线程池:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空原创 2016-11-22 20:51:55 · 20921 阅读 · 0 评论 -
一心多用多线程-future-java线程中的异步执行
经历了一波校招,实习,回到学校了,宿舍没网懒得来实验室也导致自己少写了几篇自己总结的技术博客。 现在来讲讲这两天了解到的java线程中future模式。 在web开发中,我们在静态网页中使用ajax可以进行异步请求,即在请求网络的过程中我们可以边获取请求,边继续执行其他的工作,等到请求完毕我们再使用用ajax执行完了的结果。大致的流程如下: 请求通过事件触发->服务器处理(这是浏览器仍然可以作原创 2016-11-22 14:22:41 · 785 阅读 · 0 评论 -
一心多用多线程-阻塞队列(3)-DelayQueue
三、当你点了菜,你还需要等待的DelayQueue 在现实中,我们点了菜之后呢,往往还需要等待厨师做的一个过程。厨师把未加工的菜放到队列里面任你挑选,你挑选了之后不能立刻拿走,他还需要帮你加工,联想自助餐厅拿生牛排的时候,你拿了牛排得给厨师他帮你烹饪。在多线程中延时队列DelayQueue体现了就是这样一个场景,每一个资源呢都有一个延时期限,假设当前资源已经排到队头,准备出列,但是此时不能出列,需原创 2016-11-02 18:22:37 · 446 阅读 · 0 评论 -
一心多用多线程-阻塞队列(2)-PriorityBlockingQueue
二、可根据优先级自动出菜的选菜区PriorityBlockingQueue 在现实中啊,在同等同质的产品中,人们往往会选择价格低的进行购买,PriorityBlockingQueue是一个聪明的队列,只要你告诉他一个资源的排序规则,它就会根据你给的规则定义资源被消耗的顺序(而不是以前的先进先出),要注意的一点是PriorityBlockingQueue是一个无界的队列,也就是说如果你的生产者速度一原创 2016-11-02 15:13:46 · 412 阅读 · 0 评论 -
一心多用多线程-阻塞队列(1)-ArrayBlockingQueue
线程阀是一种线程与线程之间互相制约,交互的机制。在日常生活中呀,我们常常会遇到一些生产者消费者的问题,当我们去吃自助餐的时候,是厨师把菜做好(生产者提供),然后端到自助加菜区(阻塞队列),大家可以自己拿着盘子去加菜区里面加菜(消费者消耗)。厨师把菜做好了不是第一时间给到顾客的手里,而是放到一个区域里面,用户再根据自己所需到加菜区里面加菜。有时候厨师做的慢,那么顾客就得在选菜区等待厨师,有时候顾客吃的原创 2016-11-02 14:14:12 · 1209 阅读 · 0 评论 -
一心多用多线程-线程安全问题
因为我们知道java是平台无关性语言,所以java为了忽略各个平台带来的不同的内存差异,定义了自己的JMM(java内存模型) 即对象产生是放在java堆中,线程使用的是java栈,每一次需要用到对象中的变量时,就要从java堆中抓取该变量的副本,然后进行修改使用后,再把使用后的变量放回java堆中,也就是所谓的read-load-use过程。正因为这样的过程不是原子性的,那么当多线程进行操作原创 2016-10-30 00:23:29 · 364 阅读 · 0 评论 -
一心多用多线程-线程的生命周期
想起前段时间做校招的时候经常会被问到线程的生命周期问题,现在结合api做一下归纳1.新建状态new Thread()创建一个线程,现在的线程并没有具备运动能力的,可以想象你新建了一只兔子,但是这只兔子没有你的命令不能行动2.可运行状态thread.start()当调用该命令时,线程具备运动的能力,但不一定能运动(此时有别的线程在运行,或者有一个IO在阻塞),所以具备运动能力的兔子不一定能运动,现在的原创 2016-10-29 00:33:01 · 455 阅读 · 0 评论 -
一心多用多线程-Thread的interrupt机制
使Thread中断的方式有很多种,比如调用stop()方法进行中断,但stop()方法存在线程的安全性问题,java api已经不推荐使用,那么我们想要让一个线程停止,我们可以使用java里面的interrupt机制。在本线程,或其他线程里面可以调用具体线程的interrupt()方法,调用时是这样的,被打断的线程不会立刻被打断,只是他里面的一个状态被改变,然后靠线程自己去打断自己,即线程打断是自我原创 2016-10-28 16:36:19 · 668 阅读 · 0 评论 -
一心多用多线程-Thread的api探险
1.首先谈一谈Thread的构造方法Thread() 分配新的 Thread 对象。 Thread(Runnable target) 分配新的 Thread 对象。 Thread(Runnable target, String name) 分配新的 Thread 对象。 Thread(String name) 分原创 2016-10-28 16:03:53 · 405 阅读 · 0 评论 -
一心多用多线程-线程创建的三种方式
第一次了解java线程机制,记录一下线程启动的三种方式。 1.通过继承Thread类调用一个线程public class Thread1 extends Thread{ @Override public void run() { System.out.println("线程开始运行"); } public static void main(String[原创 2016-10-28 15:53:21 · 393 阅读 · 0 评论 -
一心多用多线程-阻塞队列(7)-CyclicBarrier
七、都做好了了就一起执行-CyclicBarrier 在文章(6)中我们谈到一个现象,就是做一道菜有时候是会分出多个工序进行的,当每个工序做好了之后那到菜才能相应的被做出来。文章(6)使用的是CountDownLatch,是通过线程间调用倒数的机制实现线程间的交流通知的,而今天学习到的CyclicBarrier作用类似于CountDownLatch,但CyclicBarrier没有倒数机制。 C原创 2016-11-07 13:01:57 · 511 阅读 · 0 评论 -
一心多用多线程-阻塞队列(6)-Semaphore
六、有序的排队进场-Semaphore 在现实中我们会经常遇到排队进场的一种情况,一家餐厅能容纳的最多人数是固定的,假设是4人,那么如果来了20个人的话最多也就进去四个人吃,一个吃完了走另外一个人进去。在多线程中也会遇到这种情况,对资源来说或许每次只能支持4个线程进行作业,那么我们就需要用到Semaphore(信号量,该信号量与计算机系统里面的信号量作用效果不同)来对这个排队进场流程进行控制,在需原创 2016-11-04 21:10:18 · 924 阅读 · 0 评论 -
一头扎进多线程-阻塞队列(4)-SynchronousQueue
四.服务员的即时传送-SynchronousQueue 在现实中我们不仅仅只有自助餐,时候也需要即点即来的一些食品。顾客进入餐厅,点了一个菜,厨师把菜炒好之后拿给服务员,服务员立刻就送到顾客的餐桌上。服务员就是一个厨师与顾客之间的传递者,服务员不是选菜区,不能把做好的菜让服务员端着等待顾客拿,只能是顾客要,就立刻把菜传递过去。这样的作用机制就好像SynchronousQueue一样,该阻塞队列不缓原创 2016-11-04 01:28:29 · 511 阅读 · 0 评论