![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
文章平均质量分 81
Java多线程
AlvinUnity
这个作者很懒,什么都没留下…
展开
-
1. JUC简介
什么是JUC在并发编程中使用的工具类,由3部分组成java.util.concurrent并发包java.util.concurrent.atomic并发原子包,java.util.concurrent.locks并发锁包什么是进程后台运行的每一个程序就是一个进程什么是线程轻量级的进程依附于某一个进程上,共享这个进程所截取到的内存资源就是线程。进程/线程例子使用QQ,查看进程一定有一个QQ.exe的进程,我可以用qq和A文字聊天,和B视频聊天,给C传文件,给D发一段语言,QQ支持原创 2020-12-01 06:23:12 · 273 阅读 · 0 评论 -
2. JUC复习卖票
传统synchronized/** * 资源类 */class Ticket { private int num = 30; public synchronized void saleTicket() { if (num > 0) { System.out.println(Thread.currentThread().getName() + "\t卖出第:" +(num--)+ "\t还剩下:" + num); }原创 2020-12-04 11:48:37 · 147 阅读 · 0 评论 -
3. 复习Lambda表达式
写法拷贝小括号,写死右箭头,落地大括号@FunctionalInterfaceinterface Foo { public int add(int x, int y);}/** * 4. Lambda Express * */public class LambdaExpressDemo { public static void main(String[] args) { Foo foo = (int x, int y) -> {原创 2020-12-06 16:58:37 · 128 阅读 · 0 评论 -
4. JUC线程间的通信
多线程编程模板中判断→干活→通知synchronized实现class AirConditioner { private int num = 0; public synchronized void increment() throws InterruptedException { // 1.判断 if (num != 0) { this.wait(); } // 2.干活 nu原创 2020-12-08 21:30:49 · 141 阅读 · 0 评论 -
6. JUC线程8锁
问题标准访问,先打印邮件还是短信答案:邮件public class Lock8 { public static void main(String[] args) { Phone p = new Phone(); new Thread(() -> { try { p.sendEmail(); } catch (Exception e) { e原创 2020-12-10 23:56:33 · 82 阅读 · 0 评论 -
7. JUC集合类不安全
例子ArrayList在迭代的时候,如果同时对其修改就会抛出java.util.ConcurrentModificationException并发修改异常public class NotSafeDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i = 1; i <=30; i++) {原创 2020-12-12 08:55:18 · 130 阅读 · 1 评论 -
8. JUC-Callable
实现方法对比class MyThread implements Runnable{ @Override public void run() { }}class MyThread2 implements Callable<Integer>{ @Override public Integer call() throws Exception { return null; }}两者有什么区别?方法名不同原创 2020-12-12 18:43:33 · 124 阅读 · 0 评论 -
9. JUC辅助类CountDownLatch、CyclicBarrier、Semaphore
CountDownLatch减少计数,可以理解为倒计时例子 /** * 需求:6个同学离开教室之后,班长才可以关门走人 * 使用flag、num等标识位实现较为复杂,不推荐 */ public static void closeDoor() { for(int i = 1; i <= 6; i++){ new Thread(() -> { System.out.prin原创 2020-12-12 23:33:18 · 155 阅读 · 2 评论 -
10. JUC读写锁ReentrantReadWriteLock
简介为了满足并发的要求,多个线程同时读取一个资源类应该可以同时进行,但是如果有一个线程想去写共享资源,此时就不应该再有其它线程可以对该资源进行读或写。不加锁会导致顺序混乱,数据不一致,如果使用lock的话,会导致读写都加锁,但是我们只需要给写加锁,不需要给读加锁public class ReadWriteLockDemo{ public static void main(String[] args){ MyCache m = new MyCache(); for(int i = 1原创 2020-12-13 22:24:07 · 142 阅读 · 0 评论 -
11. JUC阻塞队列
栈与队列栈就:先进后出,后进先出队列:先进先出阻塞队列必须要阻塞/不得不阻塞线程1往阻塞队列里添加元素,线程2从阻塞队列里移除元素以蛋糕店为例,假设去买蛋糕的时候,如果柜子里没有蛋糕,则购买蛋糕这项工作将被阻塞,如果柜子里的蛋糕都满了,则生产蛋糕这项工作将被阻塞试图从空的队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素试图向已满的队列中添加新元素的线程将会被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来并后续新增用处在多线程领域:所原创 2020-12-16 06:13:41 · 175 阅读 · 0 评论 -
12. JUC线程池
作用线程池的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。优势线程复用降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。控制最大并发数提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。管理线程提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池则可以进原创 2020-12-18 23:37:11 · 120 阅读 · 1 评论 -
13. Java8之流式计算复习
内置核心四大函数式接口 @Test public void testFunction() { Function<String,Integer> f = new Function<String, Integer>() { @Override public Integer apply(String s) { return s.hashCode(); }原创 2020-12-24 18:39:52 · 107 阅读 · 1 评论 -
14. JUC分支合并框架
原理Fork:把一个复杂任务进行分拆,大事化小Join:把分拆任务的结果进行合并相关类ForkJoinPool分支合并池 类比=> 线程池ForkJoinTaskForkJoinTask 类比=> FutureTaskRecursiveTask递归任务:继承后可以实现递归(自己调自己)调用的任务例子需求:计算0-100的和流程:首先定义一个常量10,根据等差数列的方法判断end减begin是否<=常量,若满足,则直接进行原创 2020-12-27 13:03:21 · 126 阅读 · 1 评论 -
15. CompletableFuture异步编排
业务场景查询商品详情页的逻辑比较复杂,有些数据还需要远程调用,必然需要花费更多的时间。假如商品详情页的每个查询,需要如下标注的时间才能完成那么,用户需要 5.5s 后才能看到商品详情页的内容。很显然这是不能接受的。但是如果有多个线程同时完成这 6 步操作,那么只需要 1.5s 就可以完成响应。简介Future 是 Java 5 添加的类,可以获取异步计算的结果。你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的原创 2021-07-03 22:27:12 · 171 阅读 · 2 评论 -
16. JUC-volatile
1、简单谈谈volatile是什么意思volatile是Java虚拟机提供的一种轻量级的同步机制它能够保证可见性、有序性、但是不保证原子性。2、JMMJava内存模型,本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范定制了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式.可见性详细解释假设有多个线程从主内存中拷贝值到各自线程的工作内存,若有一个线程改了当前拷贝的值,并将修改好的值返回给了主内存,那就会导致其它线程操作的数据与主内存的数据产生偏差,这个时候原创 2021-01-06 17:18:54 · 199 阅读 · 0 评论 -
17. JUC你了解CAS吗
1. CAS是什么CAS的全称为Compare-And-Swap ,它是一条CPU并发原语,它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,否则继续比较直到主内存和工作内存中的值一致为止,整个过程是原子的。CAS并发原语体现在Java语言中就是sun.misc.Unsafe类中的各个方法。调用Unsafe类中的CAS方法,JVM会帮我们实现CAS汇编指令。这是一种完全依赖于硬件的功能,通过它实现了原子操作。再次强调,由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干原创 2021-01-06 22:29:59 · 128 阅读 · 0 评论 -
18. JUC谈谈你对公平锁/非公平锁/可重入锁/递归锁/自旋锁的理解
公平和非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁类似排队,先来后到非公平锁是指,在高并发的情况下,有可能后面的线程比前面的线程先得到锁,多个线程获取锁的顺序并不按照申请锁的顺序,这就可能造成优先级反转或者饥饿现象两者的区别并发包ReentrantLock的创建,可以指定构造函数的boolean类型来得到公平锁或者非公平锁,默认是非公平锁公平锁,就是很公平,在并发环境下,每个线程在获取锁时会查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入原创 2021-01-13 21:22:38 · 131 阅读 · 0 评论 -
19. JUC死锁编码及定位分析
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。若无外力干涉,它们都将无法推进下去,如果系统资源充足,进程的资源请求就能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。产生死锁的主要原因系统资源不足进程运行推进的顺序不合适资源分配不当手写一个死锁的demopublic class DeadLockDemo{ public static void main(String[] args){ String lockA = "lo.原创 2021-01-19 22:59:45 · 112 阅读 · 0 评论