![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 69
秋日的晚霞
Java领域优质创作者 新星计划·第三季【Java后端】第二名
展开
-
ThreadPoolExecutor 线程池源码学习
当创建的是核心线程时,如果没有设置allowCoreThreadTimeOut的值true(默认值为false),则将调用queue.take方法,一直阻塞,直到队列中有任务。阅读源码部分我们看的是调用线程的execute方法,java.util.concurrent.ThreadPoolExecutor#runWorker 抛出异常后,completedAbruptly为true,java.util.concurrent.ThreadPoolExecutor#processWorkerExit。原创 2023-07-09 18:02:15 · 284 阅读 · 0 评论 -
CyclicBarrier 源码
参数 n 为等待的线程数参数 barrierAction 为当等待的线程达到 参数 parties 时执行的线程任务可以看到此处对 parties 的值进行了限制 如果少于0将抛出运行时异常 IllegalArgumentException。原创 2023-07-06 21:41:27 · 239 阅读 · 0 评论 -
CountDownLatch 源码
state是一个volatile类型的变量,保证了对它的读写操作的可见性,以及禁止了指令重排序,从而确保了线程之间对state的操作是正确的和可靠的。原创 2023-07-03 22:47:50 · 243 阅读 · 0 评论 -
《Java并发编程学习》 Java是如何解决可见性与有序性的
V的值就是 true。再由于 Happen-Before的 传递性 ,在线程 A 中 ,x=1 在前,那么根据规则一(程序的顺序性规则),x=1 Happen-Before v =true这一步,而线程A 对 volatile 修饰的变量 V 的写操作 Happen-Before。当然所谓的“看到”,指的是对共享变量的操作结果可见。这条规则是指在一个线程中,按照程序顺序(可能是重排序后的顺序),前面的操作 Happens-Before 于后续的任意操作,程序前面对某个变量的修改一定是对后续操作可见的。原创 2023-03-12 11:23:06 · 572 阅读 · 0 评论 -
【Java】如何改变线程池的工作模式
1.线程池默认的工作模式有任务来了才创建核心线程;当核心线程满了之后把任务堆积到工作队列中;当工作队列满了后扩容线程池,一直到线程个数达到 maximumPoolSize 为止;如果队列已满且达到了最大线程后还有任务进来,按照拒绝策略处理;当线程数大于核心线程数时,线程等待 keepAliveTime 后还是没有任务需要处理的话,收缩线程到核心线程数。如果我想改变线程池的工作模式核心线程数上限,启用非核心线程数,非核心线程数满了,再放到工作队列中该怎么做呢?2.激进的线原创 2022-04-27 21:44:28 · 3002 阅读 · 27 评论 -
【java】 如何自己写一把多线程锁 中 重写lock,trylock,unlok方法
4.拿到unsafeimport sun.misc.Unsafe;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.AbstractQueuedSynchronize原创 2022-03-17 13:52:08 · 3463 阅读 · 30 评论 -
【java】 如何自己写一把多线程锁 上 创建 Unsafe类对象
1.先看lock接口看下这个接口有几个方法等着我们重写六个方法 加锁,尝试加锁,定时尝试加锁,解锁 主要是这是个方法 其他两个骚方法放一边 不玩这么骚的2. 准备工作创建一个类 我这里取名叫 MyReentrantLock 我的可重入锁 实现 lock接口import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.concurrent.loc原创 2022-03-17 09:50:28 · 4387 阅读 · 4 评论 -
Executors 封装的四种线程池 各自有何特点,如何使用 超详细 代码动图演示
1.了解线程池 什么是线程池 为什么要用线程池一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 例如,线程数一般取cpu数量+2比较合适,线程数过多会导致额外的线程切换开销原创 2022-03-05 23:30:17 · 1343 阅读 · 34 评论 -
面试题 java多线程通信(互相唤醒,循环打印) wait,notify案例 以及虚假唤醒 可能出现的程序卡住问题
1.循环打印public class OutWord { private String word = "输出A"; public synchronized void outA() throws InterruptedException { if (word.equals("B输出")){ this.wait(); } //输出word System.out.println("word = " +原创 2022-02-26 13:12:39 · 767 阅读 · 0 评论 -
出现死锁的四个必要条件以及如何避免 记录
出现死锁的四个条件:互斥,共享资源 X 和 Y 只能被一个线程占用; 占有且等待,线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放共享资源 X; 不可抢占,其他线程不能强行抢占线程 T1 占有的资源; 循环等待,线程 T1 等待线程 T2 占有的资源,线程 T2 等待线程 T1 占有的资源,就是循环等待。如何避免死锁首先互斥这个条件我们没有办法破坏,因为我们用锁就是为了互斥。对于“占用且等待”这个条件,我们可以一次性申请所有的资源,这样就不存在等待了。 对于“不原创 2021-09-16 18:29:35 · 610 阅读 · 0 评论