多线程
文章平均质量分 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 · 1831 阅读 · 0 评论 -
IO密集和CPU密集与多线程的联系
IO概念IO是一个通用的概念,即数据从一个地方移动到另一个地方,对一个实体来说,可以看成数据从外部进入,以及从实体输出到外部。具体来说,常见的IO请求有网络IO,磁盘IO。那么因为CPU的工作频率远远快过和其连接的外部硬件,例如磁盘,所以CPU在IO的时候经常会需要等待外部硬件完成当前任务,完成之后,才能进行下一个任务,这种情况常常称为IO阻塞,即CPU直到等待IO操作返回前,不能继续运行。IO阻塞对于CPU强大的运算能力是一个巨大的浪费。所以有了多线程,多线程是同步运行的多个任务。不过由于CPU核转载 2021-08-26 10:33:52 · 403 阅读 · 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 · 180 阅读 · 0 评论 -
线程池7大参数详细讲解
源码中7大参数位置:七大参数:拒绝请求执行的runnable的策略。理解图:1. corePoolSize线程池中的常驻核心线程数3. keepAliveTime多余的线程存活核心线程满了,阻塞队列也满了,才会开启max最大线程数,如果还是满了,就会启动拒绝策略。如果流量降下来,就按照设置的时间最大数,慢慢的回到了核心线程数。原理:注意:阿里巴巴规范拒绝策略:public class ThreadPoolDemo { public static void m原创 2020-12-31 16:53:06 · 1193 阅读 · 0 评论 -
Executors三个线程池的使用及场景
好处:底层都是ThreadPoolExecutorExecutors.newFixedThreadPoolpublic class ThreadPoolDemo { public static void main(String[] args) { ExecutorService threadPool = Executors.newFixedThreadPool(5);//一池5个处理线程 try { for (int i原创 2020-12-30 17:50:07 · 451 阅读 · 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 · 441 阅读 · 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 · 246 阅读 · 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 · 84 阅读 · 0 评论 -
Semaphore使用
Semaphore就是信号量代码:总结;跟CountDownLatch和CyclicBarrier区别就是,Semaphore可以达到复用,有减,有加,一直使用。而CountDownLatch和CyclicBarrier要一直累加和减,不好达到复用。原创 2020-12-29 10:55:18 · 552 阅读 · 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 · 150 阅读 · 0 评论 -
CountDownLatch
CountDownLatch使用例子:需要main线程最后一个触发,最后结果是main线程并非最后一个运行,引入countdownlatch加入countdownlatch结果,实现了需求。枚举使用使用枚举线程i被替换成相应的values。...原创 2020-12-29 10:27:28 · 76 阅读 · 0 评论 -
集合类不安全的问题
ArrayList是不安全的第一次运行。数量正确,但是为空第二次运行。数量不对,又为空。线程30个,出现异常:解决方案一 new Vector()可以解决。二 collections 工具类collections 还提供其他很多安全的。三 new CopyOnWriteArrayList原理:源码,参考上面的图:hashSet也是线程不安全的例子:解决方法:一 Collections工具类CopyOnWriteSet()底层是hashMap为什原创 2020-12-28 16:41:08 · 104 阅读 · 0 评论 -
Volatile详解
JMM三大特性:可见性,原子性,有序性.可见性volatile轻量级。保证可见性代码验证:结果:没有输出mission is over。加上volatile结果:有一个线程修改了值,其他的线程会收到通知,立马输出。总结:原子性vlolatile不保证原子性代码验证:如果正常能保证原子性,结果应该为20000,运行多次都没达到20000。1.因为每个线程初始都是把开始值为0放入自己的工作内存,线程1把值增加为2写入主内存,线程2把值增加成1也写回主内存,就原创 2020-12-28 11:18:34 · 163 阅读 · 0 评论