多线程
文章平均质量分 53
啦啦啦咯咯咯
一个默默学习的小程序员
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java8 CompletableFuture supplyAsync runAsync
Java8 CompletableFuture 创建线程 supplyAsync runAsync 一、前言 二、CompletableFuture创建新线程 创建测试用的业务类 supplyAsync(有返回值) runAsync(无返回值) 一、前言 Java8推出了CompletableFuture,它实现了很多功能,用它编写的代码也比较优雅。 目前大多数公司用的JDK已经从6升级到8及以上了,那么作为一名合格的Java打工人,除了要掌握之前的FutureTask和CompletionServic原创 2022-01-11 16:58:55 · 1908 阅读 · 0 评论 -
IO密集和CPU密集与多线程的联系
IO概念 IO是一个通用的概念,即数据从一个地方移动到另一个地方,对一个实体来说,可以看成数据从外部进入,以及从实体输出到外部。 具体来说,常见的IO请求有网络IO,磁盘IO。 那么因为CPU的工作频率远远快过和其连接的外部硬件,例如磁盘,所以CPU在IO的时候经常会需要等待外部硬件完成当前任务,完成之后,才能进行下一个任务,这种情况常常称为IO阻塞,即CPU直到等待IO操作返回前,不能继续运行。IO阻塞对于CPU强大的运算能力是一个巨大的浪费。 所以有了多线程,多线程是同步运行的多个任务。不过由于CPU核转载 2021-08-26 10:33:52 · 452 阅读 · 0 评论 -
原子类CAS理解
CAS 一句话:compareAndSet就是并交换。 Demo: 结果: UnSafe类 点进源码,发现有个unsafe类。 unsafe类在rt,jar 里面的原生类。 原理 每个线程取一开始的值5到自己的工作线程,线程1写回主内存的时候,看主内存是否还是5,是的话就修改为2019,而线程2的话,先要写回主内存,发现主内存的值并非是5,导致失败。 理解前提JMM: 多线程CAS理解: 总结 缺点: 1.cpu开销大 2.只能保证一个共享变量的原子操作 3.ABA问题原创 2021-01-05 16:03:57 · 226 阅读 · 0 评论 -
线程池7大参数详细讲解
源码中7大参数位置: 七大参数: 拒绝请求执行的runnable的策略。 理解图: 1. corePoolSize线程池中的常驻核心线程数 3. keepAliveTime多余的线程存活 核心线程满了,阻塞队列也满了,才会开启max最大线程数,如果还是满了,就会启动拒绝策略。如果流量降下来,就按照设置的时间最大数,慢慢的回到了核心线程数。 原理: 注意:阿里巴巴规范 拒绝策略: public class ThreadPoolDemo { public static void m原创 2020-12-31 16:53:06 · 1269 阅读 · 0 评论 -
Executors三个线程池的使用及场景
好处: 底层都是ThreadPoolExecutor Executors.newFixedThreadPool public class ThreadPoolDemo { public static void main(String[] args) { ExecutorService threadPool = Executors.newFixedThreadPool(5);//一池5个处理线程 try { for (int i原创 2020-12-30 17:50:07 · 510 阅读 · 0 评论 -
BlockingQueue实现生产者消费者
前提:之前生产者,消费者需要线程自己控制等待,唤醒。现在使用blockingQueue不需要。 代码: public class MySource { private volatile boolean isTrue = true; private AtomicInteger atomicInteger = new AtomicInteger(); private BlockingQueue blockingQueue = null; public MySource(Bloc原创 2020-12-30 12:50:19 · 482 阅读 · 0 评论 -
Synchronized和Lock的区别?
一 原始构成 二 使用方法 三 等待是否可中断 四 加锁是否公平 五 锁绑定多个条件condition 代码: 精确通知: public class ShareResource { private int number = 1; //a:1 b:2 c:3 private Lock lock = new ReentrantLock(); private Condition condition1 = lock.newCondition(); private C原创 2020-12-30 10:34:18 · 328 阅读 · 1 评论 -
多线程生产者消费者模式
前提知识 synchronized 使用wait等待线程,notify唤醒线程 lock使用Condition condition = lock.newCondition(); condition中的await等待线程,signal唤醒线程。 上代码: public class ShareDate { private int number = 0; private Lock lock = new ReentrantLock(); private Condition conditi原创 2020-12-30 09:39:27 · 119 阅读 · 0 评论 -
Semaphore使用
Semaphore就是信号量 代码: 总结;跟CountDownLatch和CyclicBarrier区别就是,Semaphore可以达到复用,有减,有加,一直使用。而CountDownLatch和CyclicBarrier要一直累加和减,不好达到复用。原创 2020-12-29 10:55:18 · 591 阅读 · 0 评论 -
CyclicBarrier使用
理论: 与CountDownLatch相反,CountDownLatch是做减法的,减到0才开始。而CyclicBarrier是做加法,加到一定数值,才开始执行。 代码: public class CycllicBarrierDemo { public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(7, new Thread(new Runnable() {原创 2020-12-29 10:45:38 · 192 阅读 · 0 评论 -
CountDownLatch
CountDownLatch使用 例子:需要main线程最后一个触发,最后结果是main线程并非最后一个运行,引入countdownlatch 加入countdownlatch 结果,实现了需求。 枚举使用 使用枚举线程i被替换成相应的values。 ...原创 2020-12-29 10:27:28 · 106 阅读 · 0 评论 -
集合类不安全的问题
ArrayList是不安全的 第一次运行。数量正确,但是为空 第二次运行。数量不对,又为空。 线程30个,出现异常: 解决方案 一 new Vector()可以解决。 二 collections 工具类 collections 还提供其他很多安全的。 三 new CopyOnWriteArrayList 原理: 源码,参考上面的图: hashSet也是线程不安全的 例子: 解决方法: 一 Collections工具类 CopyOnWriteSet() 底层是hashMap 为什原创 2020-12-28 16:41:08 · 136 阅读 · 0 评论 -
Volatile详解
JMM三大特性:可见性,原子性,有序性. 可见性 volatile轻量级。 保证可见性代码验证: 结果:没有输出mission is over。 加上volatile 结果:有一个线程修改了值,其他的线程会收到通知,立马输出。 总结: 原子性 vlolatile不保证原子性 代码验证: 如果正常能保证原子性,结果应该为20000,运行多次都没达到20000。 1.因为每个线程初始都是把开始值为0放入自己的工作内存,线程1把值增加为2写入主内存,线程2把值增加成1也写回主内存,就原创 2020-12-28 11:18:34 · 207 阅读 · 0 评论
分享