随笔分类 -  多线程与并发

1
摘要:前言 先说结论,没兴趣了解原因的可以只看此处的结论 CompletableFuture是否使用默认线程池的依据,和机器的CPU核心数有关。当CPU核心数-1大于1时,才会使用默认的线程池,否则将会为每个CompletableFuture的任务创建一个新线程去执行。 即,CompletableFutu 阅读全文
posted @ 2022-04-04 13:21 穿黑风衣的牛奶 阅读(21049) 评论(8) 推荐(15)
摘要:线程池的作用 我们在用一个东西的时候,首先得搞明白一个问题。这玩意是干嘛的,为啥要用这个,用别的不行吗。那么一个一个解决这些问题 我们之前都用过数据库连接池,线程池的作用和连接池有点类似,频繁的创建,销毁线程会造成大量的不必要的性能开销,所以这个时候就出现了一个东西统一的管理线程,去负责线程啥时候销 阅读全文
posted @ 2020-06-07 22:38 穿黑风衣的牛奶 阅读(1087) 评论(1) 推荐(1)
摘要:在前一篇文章中我们介绍了Executors 以及这个线程可以创建的一系列不同类型和作用的线程池,用于各种场景的管理线程,但是在查看这些创建线程的代码中,可以发现,不管是什么哪种线程池,其实本质上都是new了一个ThreadPoolExecutor类,只是传入的参数不同,所以发挥的作用也不同 框架 首 阅读全文
posted @ 2020-06-04 13:43 穿黑风衣的牛奶 阅读(441) 评论(0) 推荐(0)
摘要:sleep sleep方法是在Thread类中的一个静态方法,当一个线程调用了sleep方法,被调用的那个线程就会暂时的让出指定时间的CPU执行权,在这段时间也不会参与CPU的调度,当时间到了之后,就会重新回到就绪状态,等待CPU的再次调度,注意是就绪状态,而不是重新拿回CPU的执行权。并且,在休眠 阅读全文
posted @ 2020-05-26 16:14 穿黑风衣的牛奶 阅读(1333) 评论(0) 推荐(0)
摘要:Object对象概述 在说这些方法之前,有一点需要先思考一下,为什么wait,notify,notifyAll这些跟线程有关的方法是封装在Object中而不线程的Thread类呢?这也是一道面试题经常问的内容。 其实答案很简单,之前我们说过,可以把任意的对象作为锁资源进行竞争,而Object是所有类 阅读全文
posted @ 2020-05-26 16:01 穿黑风衣的牛奶 阅读(447) 评论(0) 推荐(0)
摘要:在以往的线程交互中,我们唤醒线程或者阻塞线程一般都是用notify/wait/await等等函数,但是还是不够灵活。例如说,我现在有十个线程,如果是我想唤醒或者挂起这其中的一部分线程的话,那我可以使用Condition,将这部分线程分队列,也就是ReentrantLock里面的,newConditi 阅读全文
posted @ 2020-05-25 20:35 穿黑风衣的牛奶 阅读(396) 评论(1) 推荐(0)
摘要:要实现同步,一般我们会用synchronized,但是其实除了synchronized之外,还有一些方法,比如说ReentrantLock,ReentrantLock其实是完全可以取代synchronized的,而且比synchronized会更灵活 ReentrantLock概述 Reentran 阅读全文
posted @ 2020-05-24 21:14 穿黑风衣的牛奶 阅读(462) 评论(0) 推荐(0)
摘要:A其实本来这篇文章一直纠结要不要写,想写又觉得自己水平不够,但是不写的话,后面的ReentrantLock又是基于AQS的,可以说是整个Java并发编程中JUC包中最核心的部分,所以还是打算写一下,水平有限,本篇文章只是对AQS比较浅的探讨,不会太过深入源码,更多的是去理解AQS的整个过程 什么是A 阅读全文
posted @ 2020-05-24 21:12 穿黑风衣的牛奶 阅读(768) 评论(0) 推荐(0)
摘要:前言:前面的内容中我们一直在讲锁,其实多线程的关键问题就是在线程安全,而保障线程安全的方式一般有两种,一种就是加锁,另一种则是CAS,CAS之前已经知道了是什么东西,接下来说一下锁,其实锁也有很多种分类。例如悲观锁,乐观锁等等。。。有助于理解后面的难点 悲观锁和乐观锁 一般乐观锁和悲观锁都是在数据库 阅读全文
posted @ 2020-05-23 10:28 穿黑风衣的牛奶 阅读(1243) 评论(0) 推荐(0)
摘要:ThreadLocal作用 对于多个线程访问一个共享变量的时候,我们往往要通过加锁的方式进行同步,像这样 但是除此之外,其实还有另一种方式可以隔绝线程对于共享变量读写的独立性。那就是ThreadLocal。如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有一块独立的空间,当 阅读全文
posted @ 2020-05-20 14:15 穿黑风衣的牛奶 阅读(1334) 评论(0) 推荐(0)
摘要:前言:之前介绍了synchronized关键字,知道通过synchronized可以实现互斥来保证内存的可见性问题,但是同时也说到了,synchronized是一个非常重量级的锁,即便后面引入了锁的升级过程,但是如果是这种情况,你只想保证代码里某些变量的内存可见性,就直接对这些变量,或者使用了这些变 阅读全文
posted @ 2020-05-18 16:18 穿黑风衣的牛奶 阅读(1120) 评论(0) 推荐(0)
摘要:在之前的两篇文章中,介绍了synchronized的一些用法以及原理,但是同时也提到了一个问题,就是synchronized实际上是一种重量级的锁,本身很笨重,因为synchronized是互斥的,所以在切换线程的时候,线程上下文切换会引起大量的性能开销。也正是因为这个性能原因饱受诟病,因此在jdk 阅读全文
posted @ 2020-05-17 18:12 穿黑风衣的牛奶 阅读(371) 评论(0) 推荐(0)
摘要:前言:在上一篇博客说完了synchronized锁的到底是什么,以及基本的用法,作用,算是synchronized的预备知识。但是学东西要知其然也要知其所以然,所以这篇准备深入的分析,synchronized的原理,synchronized到底是怎么实现同步,保证线程安全的。 Java代码层面 Ja 阅读全文
posted @ 2020-05-17 17:14 穿黑风衣的牛奶 阅读(584) 评论(3) 推荐(0)
摘要:前言:现在网上很多文章讲synchronized的锁这个锁那个,让人很是迷糊,那么synchronized锁住的到底是什么呢? 作用 synchronized主要可以用来解决以下几个问题: 解决变量内存可见性问题:保证共享变量的修改的可以及时的刷新到主存中。实现方式为:被synchronized修饰 阅读全文
posted @ 2020-05-14 16:14 穿黑风衣的牛奶 阅读(2323) 评论(0) 推荐(1)
摘要:程序的局部性原理 存储结构 在说局部性原理的时候,先来了解一下计算机的存储结构,设计到计算机组成结构的一些知识,计算机的存储结构,主要分以下几层,其中的磁盘跟本文无关。就暂且不提 内存 :一般也叫主存,存储的是程序运行所需要的数据,操作指令,中间结果和最终结果等。cpu就是从内存中调取数据进运算器执 阅读全文
posted @ 2020-05-11 21:48 穿黑风衣的牛奶 阅读(569) 评论(0) 推荐(0)
摘要:指令重排序 Java内存模型里面允许编译器和处理器对指令进行重排序以提高运行效率,并且只会对不存在数据依赖的指令进行重排序。例如像 指令重排序的好处 指令重排序有利于提高性能,可以看这个代码。 第一部分的代码可能就不会有部分2的性能高,因为a可以直接从寄存器中取,不需要反复的拿a。定义完a之后马上就 阅读全文
posted @ 2020-05-10 17:15 穿黑风衣的牛奶 阅读(916) 评论(0) 推荐(2)
摘要:线程中的原子性: 所谓原子性,就是一系列操作,要么全部执行,要么全部不执行,不会存在只执行一部分的情况,举个例子,对于i这个操作,那么这个自增的操作完整步骤分三步,读i的值 改i的值 写回i的值;如果不对i进行加锁,在执行这三步的时候,比如说改i的值的的时候,线程被打断了,那么就会出现预期结果不一致 阅读全文
posted @ 2020-05-10 15:37 穿黑风衣的牛奶 阅读(634) 评论(0) 推荐(1)
摘要:线程上下文切换 在说到线程安全问题之前,首先思考一个问题,由于前面的预备知识里面提到的,操作系统是通过抢占式调度和时间片轮转相结合的方式来调度线程,当线程的时间片用完之后,就会被剥夺cpu的执行权,因此,线程可能在执行一段代码的任何时刻被中断,那么问题来了,中断后的线程,在下一次恢复执行的时候,怎么 阅读全文
posted @ 2020-05-08 22:33 穿黑风衣的牛奶 阅读(284) 评论(0) 推荐(0)
摘要:线程/进程的基本状态 和传统的进程一样,线程也拥有三种基本状态,分别是 执行状态:表示该线程获得了CPU的执行权正在运行 就绪状态:表示该线程已经具备了执行所需要的预备条件,等待CPU调度就可以立即执行,在Java中体现为调用了start()方法,或者线程休眠时间完毕等等。但是此时还没有开始执行。需 阅读全文
posted @ 2020-05-08 14:55 穿黑风衣的牛奶 阅读(425) 评论(0) 推荐(0)
摘要:前言:为准备本文:特地把大学的操作系统的书拿出来翻了几页。 分时与多道批处理系统 由于最早的计算机只支持单道系统,即处理完一个作业之后才会处理下一个作业,这样由于在处理一个程序的过程中,其他程序需要等待这个程序完成之后才能进入到CPU内执行,而在这段时间内,其他的设备都处于等待状态,就造成了资源的浪 阅读全文
posted @ 2020-04-27 22:09 穿黑风衣的牛奶 阅读(287) 评论(0) 推荐(0)

1