juc
文章平均质量分 55
林小果呀
发文全看心情,要详细笔记可私我
展开
-
读写锁
当读操作远远高于写操作时,这时候使用读写锁让读-读可以并发,提高性能。原创 2024-09-06 21:30:31 · 192 阅读 · 0 评论 -
AQS
Override@Override@Override有了自定义同步器,很容易复用 AQS ,实现一个功能完备的自定义锁@Override// 尝试,不成功,进入等待队列@Override// 尝试,不成功,进入等待队列,可打断@Override// 尝试一次,不成功返回,不进入队列@Override// 释放锁@Override// 尝试,不成功,进入等待队列,有时限@Override// 生成条件变量。原创 2024-09-06 11:53:33 · 655 阅读 · 0 评论 -
Fork/Join
跟递归相关的一些计算,如归并排序、斐波那契数列、都可以用分治思想进行求解 Fork/Join 在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升了运算效率。提交给 Fork/Join 线程池的任务需要继承 RecursiveTask(有返回值)或 RecursiveAction(没有返回值)Fork/Join 默认会创建与 cpu 核心数大小相同的线程池。Fork/Join 用于能够进行任务拆分的 cpu 密集型运算。原创 2024-09-06 11:52:47 · 431 阅读 · 0 评论 -
volatile
(易变的)属性,避免从工作缓存中读取值,而必须到主缓存中获取值,保证数据在不同线程中的可见性。可以保证可见性和有序性,但它并不能保证复合操作(如自增、自减或检查后执行逻辑)的原子性。问题:r1的结果可能为0,因为actor2中的两行代码可能会发生指令重排,导致执行顺序颠倒。问题:t 线程会从自己的高速缓存中读取run值,而无法获取到更新后的值,导致程序无法结束。而有了屏障之后,可见性和有序性就有了很好的解决。)来控制对共享资源的并发访问。解决方法:给run加上。解决:给ready添加。原创 2024-09-05 22:34:12 · 430 阅读 · 0 评论 -
CAS
CAS(Compare and Swap,比较并交换)基本思想是,在更新某个值之前,先比较其内存中的值是否与预期的值相等,如果相等,则进行更新;如果不相等,则不更新。结合 CAS 和 volatile 可以实现无锁并发,适用于线程数少、多核 CPU 的场景下。原创 2024-09-05 22:32:15 · 274 阅读 · 0 评论 -
线程池
特点:核心线程数 == 最大线程数(没有救急线程被创建),因此也无需超时时间。阻塞队列是无界的,可以放任意数量的任务,适用于任务量已知,相对耗时的任务。提供了一个线程池管理器,可以用来执行异步任务。线程池可以有效地重用线程,减少了线程创建和销毁的开销,提高系统响应速度,并允许控制并发任务的数量。使用场景: 希望多个任务排队执行。线程数固定为 1,任务数多于 1 时,会放入无界队列排队。任务执行完毕,这唯一的线程 也不会被释放。当线程池和队列都满了,新提交的任务将会被拒绝。原创 2024-09-05 22:31:20 · 977 阅读 · 0 评论 -
ReentrantLock
可重入是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁 如果是不可重入锁,那么第二次获得锁时,自己也会被锁挡住。ReentrantLock 的条件变量比 synchronized 强大之处在于,它是支持多个条件变量的。与 synchronized 一样,都支持可重入。ReentrantLock 默认是不公平的。但公平锁一般没有必要,会降低并发度。强行插入,有机会在中间输出。强行插入,总是在最后输出。原创 2024-08-18 18:46:59 · 611 阅读 · 0 评论 -
交替输出
题目:线程 1 输出 a 5 次,线程 2 输出 b 5 次,线程 3 输出 c 5 次。现在要求输出。原创 2024-08-18 18:46:14 · 319 阅读 · 0 评论 -
synchronized 原理
1)如果调用 hashCode 会导致偏向锁被 撤销,轻量级锁会在锁记录中记录 hashCode,重量级锁会在 Monitor 中记录 hashCode,而偏向锁只能在 markword 中记录hashCode。如果在尝试加轻量级锁的过程中,CAS 操作无法成功,这时一种情况就是有其它线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。创建锁记录(Lock Record)对象,每个线程都的栈帧都会包含一个锁记录的结构,内部可以存储锁定对象的 Mark Word。原创 2024-08-16 20:35:29 · 892 阅读 · 0 评论 -
wait / notify
obj.wait()让进入 object 监视器的线程到 waitSet 等待在 object 上正在 waitSet 等待的线程中挑一个唤醒让 object 上正在 waitSet 等待的线程全部唤。原创 2024-08-16 20:32:34 · 272 阅读 · 0 评论 -
线程状态
如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CPU,会导致线程上下文切换,进入阻塞状态,等 BIO 操作完毕,会由操作系统唤醒阻塞的线程,转换至可运行状态。(由于 BIO 导致的线程阻塞,在 Java 里无法区分,仍然认为 是可运行):指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行。:表示线程已经执行完毕,生命周期已经结束,不会再转换为其它状态。:仅是在语言层面创建了线程对象,还未与操作系统线程关联。:线程已经被创建,但尚未启动。原创 2024-08-14 22:02:07 · 526 阅读 · 0 评论 -
线程常见方法
相当于设置线程的中断状态。:让当前执行的线 程休眠n毫秒,休眠时让出CPU的时间片给其它 线程。:提示线程调度器,让出当前线程对 CPU的使用,主要是为了测试和调试。:测试当前线程是否被中断,并清除中断状态。守护线程会在所有非守护线程执行完后强制关闭。:恢复被挂起的线程。:等待该线程终止,最多等待指定的毫秒数。:线程的入口点,包含线程要执行的操作。可用来阻塞当前线程,在其他线程中使用。:设置线程为守护线程或用户线程。:判断线程是否为守护线程。:测试线程是否被中断。:设置线程的优先级。:返回线程的优先级。原创 2024-08-14 22:01:06 · 444 阅读 · 0 评论 -
两阶段终止
在多线程编程中,正确地终止一个正在运行的线程是一个比较复杂的问题,因为线程可能在执行重要的任务,简单地中断它可能会导致数据不一致或者资源泄露。两阶段终止设计模式(Two-Phase Termination Pattern)是在处理线程终止的一种设计模式。两阶段终止设计模式提供了一种优雅的方式来终止线程,同时确保线程有机会清理资源并安全退出。原创 2024-08-13 20:40:30 · 309 阅读 · 0 评论 -
创建线程的三种方式
t2.start();原创 2024-08-13 20:39:29 · 158 阅读 · 0 评论