
线程
文章平均质量分 92
东大资土是冠军
2022年6月毕业于东北大学资源与土木工程学院。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
多线程相关面试题(逐渐补充)
进程是系统分配资源的最小单位,线程是系统调度的最小单位。两个方法,两个线程分别同时用这个方法,请问会发生什么?在多线程下,如果对一个数进行叠加,该怎么做?其中堆区这个内存区域是多个线程之间共享的。状态之间怎么切换的?在创建线程的时候需要指定线程完成的任务。同一个进程的线程之间共享同一个内存空间。再由线程池中的工作线程来执行任务。创建线程池的接口是什么?是可能出现线程不安全的情况的。可以第一时间读取到最新的值。多线程是如何实现数据共享的。就可以让多个线程都能访问到。此时如果有其他线程修改被。原创 2023-08-17 16:18:48 · 85 阅读 · 0 评论 -
多线程基础 6. volatile 及 7. wait, notify
此时, 编译器就做出一个大胆的决策, 直接把load操作优化掉了. 只有第一次执行该语句时执行load操作, 后续不再load, 直接拿寄存器中的数据进行比较.但在另一个线程 t2 中把内存中的counter.flag 给改了, 但是线程 t1 中, 并没有重复读取counter.flag 的值, 因此 t1 线程就无法感知到 t2 的修改。线程饿死指的是 : 有些情况下 , 调度器可能分配任务不均匀 , 导致有些线程反复占用 CPU , 有些线程始终捞不着 CPU (涝的涝死 , 旱的旱死)原创 2023-08-11 17:16:54 · 103 阅读 · 0 评论 -
多线程进阶之常见的锁策略
通过内核态, 借助系统提供的锁机制, 当出现锁冲突的时候会牵扯到内核对于线程的调度. 使冲突线程出现挂起 (阻塞等待)轻量级锁主要是尽量的避免使用操作系统提供的锁 , 尽量在用户态完成功能 , 也就是尽量的避免用户态和内核态的切换 , 尽量避免挂起等待 (阻塞等待)重量级锁主要是依赖了操作系统提供的锁 , 使用操作系统提供的锁 , 就很容易产生阻塞等待。正因为这样的概念存在重合, 针对一个具体的锁, 可能把它叫做乐观锁, 也可能叫做轻量锁。轻量级锁: 加锁开销比较小的 (花的时间少, 占用系统资源少)原创 2023-08-15 21:20:37 · 110 阅读 · 0 评论 -
9.3 定时器
定时器也是软件开发中的一个重要组件类似于一个闹钟".达到一个设定的时间之后就执行某个指定好的代码.定时器是一种实际开发中非常常用的组件.比如网络通信中, 如果对方 500ms 内没有返回数据, 则断开连接尝试重连.比如一个 Map, 希望里面的某个 key 在 3s 之后过期(自动删除).类似于这样的场景就需要用到定时器.原创 2023-08-13 23:27:33 · 114 阅读 · 0 评论 -
9.4 多线程之线程池
进程已经能做到并发编程了 , 为什么还需要线程?原创 2023-08-15 11:11:50 · 128 阅读 · 0 评论 -
多线程之线程安全的集合类
原来的集合类, 大部分都不是线程安全的.Vector, Stack, HashTable, 是线程安全的(不建议用), 其他的集合类不是线程安全的.Vector 和 HashTable 属于上古Java时期 搞出来的集合类()加了synchronized加了锁 不一定是线程安全的, 不加锁也不一定就是线程不安全 => 需要结合问题具体分析同时在单线程的情况下, 又可能因为synchronized 影响到执行效率(锁消除不是100%)后续设计的集合类, 就不再是这种加锁方式了。原创 2023-08-17 15:35:58 · 177 阅读 · 0 评论 -
多线程进阶之JUC (java.util.concurrent)
当计数器数值为0 的时候, 继续进行P操作, 就会阻塞等待, 一直等待到其他线程执行了V操作, 释放了一个空闲资源为止。当有车开进去的时候, 就相当于申请一个可用资源, 可用车位就 -1 (称为信号量的 P 操作)当有车开出来的时候, 就相当于释放一个可用资源, 可用车位就 +1 (称为信号量的 V 操作)如果计数器的值已经为 0 了, 还尝试申请资源, 就会阻塞等待, 直到有其他线程释放资源.Semaphore 的 PV 操作中的加减计数器操作都是原子的, 可以在多线程环境下直接使用。原创 2023-08-16 22:48:53 · 112 阅读 · 0 评论 -
多线程进阶之CAS
CAS 全称Compare and swap,字面意思:”比较并交换“,一个 CAS 涉及到以下操作:CAS 是 操作系统 / 硬件 给 JVM 提供的另外一种更轻量的原子操作的机制CAS 是 CPU 提供的一个特殊指令 : compare and swap (比较和交换是一条指令 -> 原子的)compare : 能够比较和交换 某个寄存器中的值 和 内存 中的值, 看是否相等, 如果相等则把另外一个寄存器中的值和内存进行交换我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。原创 2023-08-16 17:10:42 · 171 阅读 · 0 评论 -
多线程之死锁及synchronized内部优化过程
1) 一个线程, 一把锁, 但锁是不可重入锁. 该线程针对这个锁连续加锁两次,就会出现死锁2) 两个线程, 两把锁, 这两个线程先分别获取到一把锁, 然后再同时尝试获取对方的锁门钥匙锁车里了,车钥匙锁家里了3) N 个线程M 把锁哲学家就餐问题~~每个哲学家 , 主要做两件事:1. 思考人生. 会放下筷子2. 吃面, 会拿起左手和右手的筷子其他设定:1) 每个哲学家, 啥时候思考人生, 啥时候吃面条都不说。原创 2023-08-16 12:07:50 · 174 阅读 · 0 评论 -
9.2 多线程基础之阻塞队列
阻塞队列是一种特殊的队列也遵守先进先出的原则阻塞队列能是一种线程安全的数据结构并且具有以下特性当队列满的时候继续入队列就会阻塞直到有其他线程从队列中取走元素当队列空的时候继续出队列也会阻塞直到有其他线程往队列中插入元素阻塞队列的一个典型应用场景就是生产者消费者模型".这是一种非常典型的开发模型2 生产者消费者模型。原创 2023-08-13 18:46:29 · 188 阅读 · 0 评论 -
9.1 单例模式
单例模式是校招中最常考的设计模式之一.啥是设计模式?设计模式好比象棋中的 "棋谱". 红方当头炮, 黑方马来跳. 针对红方的一些走法, 黑方应招的时候有 一些固定的套路. 按照套路来走局势就不会吃亏.软件开发中也有很多常见的 "问题场景". 针对这些问题场景, 大佬们总结出了一些固定的套路. 按照 这个套路来实现代码, 也不会吃亏.单例模式能保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例.这一点在很多场景上都需要. 比如 JDBC 中的 DataSource 实例就只需要一个.原创 2023-08-12 00:12:10 · 95 阅读 · 0 评论 -
多线程之 3. 线程状态, 4. 线程安全, 5. synchronized
java专门封装了yield 方法 效果和sleep(0)一样yield 不改变线程的状态, 但是会重新去排队上述代码输出得到下列几个状态: 但如果上述的操作, 在两个线程,或者更多个线程并发执行的情况下, 就可能会出现问题 输出永远达不到10000原因: 两个线程的调度顺序是不确定的, 两组操作的相对顺序也是会存在差异的.导致类似下图中的组合顺序有无数种.寄存器只有一个 但t1, t2分时使用看作两个1.[根本原因] 多个线程之间的调度顺序是"随机的", 操作系统使用"抢占式"执行的策略原创 2023-08-10 23:47:10 · 111 阅读 · 0 评论