![](https://img-blog.csdnimg.cn/c069a799887b41f1b992009795326ce1.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
多线程
文章平均质量分 93
线程相关知识
马尔科686
这个作者很懒,什么都没留下…
展开
-
【多线程】(6)(Callable接口 JUC的常见类 ReentrantLock 原子类 Semaphore CountDownLatch 线程安全集合类 多线程环境使用哈希表,ArrayList)
可以把信号量想象成是停车场的展示牌: 当前有车位 100 个. 表示有 100 个可用资源.当有车开进去的时候, 就相当于申请一个可用资源, 可用车位就 -1 (这个称为信号量的 P 操作)当有车开出来的时候, 就相当于释放一个可用资源, 可用车位就 +1 (这个称为信号量的 V 操作)如果计数器的值已经为 0 了, 还尝试申请资源, 就会阻塞等待, 直到有其他线程释放资源.信号量, 用来表示 “可用资源的个数”. 本质上就是一个计数器.此处的信号量是Java把操作系统原生的信号量封装了一下.原创 2023-07-19 20:54:50 · 110 阅读 · 1 评论 -
【多线程】(5)(常见的锁策略 CAS的应用场景 实现原子类 实现自旋锁 CAS 的 ABA 问题 Synchronized 原理 优化操作 锁升级/锁膨胀 锁消除 锁粗化)
CAS: 全称Compare and swap,字面意思:”比较并交换“.我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。比较 A 与 V 是否相等。(比较)如果比较相等,将 B 写入 V。(交换)返回操作是否成功。上述CAS的过程,并非是通过一段代码实现的,而是通过一条CPU指令完成的.也就是说CAS操作是原子的,就可以在一定程度上解决线程安全问题.小结:CAS可以理解成CPU给咱提供的一个特殊指令,通过指令就可以一定程度的处理线程安全问题.原创 2023-07-18 17:38:07 · 160 阅读 · 0 评论 -
【多线程】(4)(多线程案例 单例模式 饿汉模式 懒汉模式 阻塞式队列 阻塞队列实现 定时器使用 手写定时器 线程池 工厂模式 ThreadPoolExecutor构造方法参数 手写简单线程池)
创建线程/销毁线程,是交由操作系统内核完成的,从池子里获取/还给池,是咱们自己用户代码就能实现的,不必交给内核操作.相比于内核来说,用户态,程序执行的行为是可控的.要想做某个工作,就会非常干净利落的完成(从池子里取/还给池子).如果要是通过内核,从系统这里创建个线程,就需要通过系统调用,让内核来执行了(内核不只是给你一个应用程序服务,它是给所有的程序都要提供服务的).因此当使用系统调用执行内核代码的时候,无法确定内核都要做哪些工作,整体过程是"不可控"的.优先队列(PriorityQueue).原创 2023-07-17 23:20:46 · 85 阅读 · 0 评论 -
【多线程】(3)(synchronized 关键字 可重入 synchronized修饰方法 修饰代码块 Java标准库中线程安全类 volatile 关键字 wait 和 notify)
CPU读取寄存器比读取内存速度快很多,一次就会在CPU内部引入缓存cache,寄存器存储空间小,读写速度快,贵,中间有个cache,它存储空间居中读写速度居中,成本居中,内存的存储空间大,读写速度慢,便宜.当CPU要读取一个内存数据的时候,可能是直接读内存,也可能是读cache,还可能是读寄存器.比如t1,t2两个线程,希望t1先干活,等干的差不多了,再让t2来干.就可以让t2先wait(阻塞,主动放弃CPU),等t1干的差不多了,再通过notify通知t2,把t2唤醒让t2接着干.原创 2023-07-14 23:34:50 · 157 阅读 · 0 评论 -
【多线程】(2) (观察线程状态 线程的状态转移 观察线程的状态和转移 案例:单线程-串行执行 多线程-并发执行 观察线程中不安全的情况 线程安全概念 线程不安全的原因 解决线程不安全问题)
如果没有多线程,此时程序代码执行顺序就是固定的(只有一条路),代码顺序固定,程序的结果就是固定的.如果有了多线程,此时抢占式执行下,代码的执行的顺序会出现更多的变数.此时代码执行顺序的可能性就从一种情况变成了无数种情况.所以就需要保证这种无数种线程调度顺序的情况下,代码的执行结果都是正确的.状态是针对当前线程调度的情况来描述的.现在我们认为线程是调度的基本单位.所以状态更应该是线程的属性.(后面我们谈到的状态都是线程的状态)通过循环获取就能看到这里的交替状态了.当前获取到的状态完全取决于系统里的调度操作.原创 2023-06-24 17:37:03 · 49 阅读 · 0 评论 -
【多线程】(1) (进程和线程 多线程编程 创建线程 实现Runnable 匿名内部类继承Thread,Runable Lambda表达式 构造方法和属性 中断线程 等待,获取,休眠线程 )
是否是守护线程,是否是"后台线程",前台线程会阻止进程结束,前台线程的工作没做完,进程是不能结束的.后台线程不会阻止进程结束,后台线程的工作没做完,进程是可以结束的.代码里手动创建的线程默认都是前台的.包括main默认也是前台的.其他的JVM自带的线程都是后台线程,是后台线程就是守护线程.线程是解决并发编程的前提下,让创建,销毁,调度的速度更快点,它是一个"轻量级进程".线程"轻"的原因是:它把申请资源/释放资源的操作给省下了.多进程是再调用一些新的空间和成本,多线程可以做到公用资源.此时代码改动比较小.原创 2023-06-12 19:15:22 · 1175 阅读 · 2 评论