JUC
文章平均质量分 68
JUC学习笔记
JohnGea
这个人不懒,他写了简介
展开
-
15、Stream流式计算
什么是Stream流式计算?在如今大数据时代,数据的操作以存储、计算为主,像我们所学的集合、MySQL本质都是为了存储数据;而真正的计算,我们就应该交给流来完成。案例分析:题目要求:只用一行代码实现现在有五个用户,筛选:1、ID必须为偶数;2、年龄必须大于23岁;3、用户名转为大写字母;4、用户名字母倒序;5、只输出一个用户;public class Demo { public static void main(String[] args) { User .原创 2021-09-07 15:32:22 · 138 阅读 · 0 评论 -
14、四大函数式接口(必须掌握)
新时代的程序员必会:lambda表达式、链式编程、函数式接口、Stream流式计算函数式接口:只有一个方法的接口。例如:Runnable接口@FunctionalInterfacepublic interface Runnable { public abstract void run();}/**在Java中有大量的FunctionalInterface使用函数式接口,能够简化编程模型,在新版本的框架中有大量的使用 */四大原生函数式接口:Function函数式接口:代原创 2021-09-07 14:58:21 · 199 阅读 · 0 评论 -
13、线程池
程序的运行,本质就是消耗系统资源,当我们频繁的创建和销毁线程时,会十分浪费系统资源,因此为了优化资源的使用,我们就有必要使用线程池的技术。池化技术:实现分配好一定的资源,当有需要用时,就从分配好的资源中取出,用完后再归还;1、线程池的优势(1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。(2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。(3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程原创 2021-09-06 17:17:32 · 334 阅读 · 2 评论 -
12、BlockingQueue
认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中所起的作用大致如下图所示:从上图我们可以很清楚看到,通过一个共享的队列,可以使得数据由队列的一端写入,从另外一端取出;可以看到,BlockingQueue和List、Set接口一样是继承于Collection接口;简要概述BlockingQueue常用的四个实现类1、ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象原创 2021-09-06 15:22:36 · 124 阅读 · 0 评论 -
11、ReadWriteLock 读写锁
ReadWriteLock也是一个接口,提供了readLock和writeLock两种锁的操作机制,一个资源可以被多个线程同时读,但是只能被一个线程写,但是不能同时存在读和写线程。读写锁机制读—读 不互斥读—写 互斥写—写 互斥演示代码:public class ReadWriteLockDemo { public static void main(String[] args) { MyCache cache = new MyCache(); /.原创 2021-09-05 16:40:38 · 97 阅读 · 0 评论 -
10、常用的辅助类
10.1、CountDownLatch(计数器)官方文档中,对这一块的解释比较复杂,简单来说,该类就是一个减法计数器,一般用于计算线程的执行次数,当达到0时执行某一操作。举个例子,假设现在一个班上有6名学生,现在放学了,老师要关教室门,就必须要等6名同学全部走完才能关门,因此,每走一个学生,就对剩下的学生总数-1,直到所有学生都走完,老师才能关教室门。我们来实现这个案例:public class CountDownLatchDemo { public static void main(原创 2021-09-05 15:56:46 · 153 阅读 · 0 评论 -
9、Callable
我们先回顾一下java.lang.Runnable接口,在Runnable接口中声明了run(),其返回值为void,当然就无法获取结果了。public interface Runnable { public abstract void run();}而Callable的接口定义如下:public interface Callable<V> { V call() throws Exception; } 在官方文档中详细介绍了Callable接口,我原创 2021-09-05 14:50:10 · 143 阅读 · 0 评论 -
7、CopyOnWriteArraySet
同上一节中我们学习的ArrayList,在Set集合中,HashSet同样是线程不安全的。public class CopyOnWrite_Set { public static void main(String[] args) { Set<Object> set = new HashSet<>(); for (int i = 1; i <= 10; i++) { new Thread(()->{原创 2021-09-04 17:58:29 · 171 阅读 · 0 评论 -
6、CopyOnWriteArrayList
在之前Java基础学习集合的时候,我们听说过ArrayList是线程不安全的,但是还没有了解为什么它不安全。import java.util.ArrayList;import java.util.List;import java.util.UUID;public class CopyOnWrite_List { public static void main(String[] args) { //资源类 List<Object> list = new原创 2021-05-28 10:47:59 · 156 阅读 · 1 评论 -
5.八锁现象
1、标准访问,两个线程操作同一个资源类(谁先获取到锁谁先执行)public class EightLock { public static void main(String[] args) { //创建一个资源类 Phone phone = new Phone(); //创建两条线程,一个打电话,一个发短信 new Thread(()->{ phone.call(); },"A").sta原创 2021-05-27 19:51:01 · 102 阅读 · 0 评论 -
4.生产者和消费者的问题(线程通信)
线程间的通信问题,用一个最经典的例子来讲就是生产者和消费者问题:假设我们现在有两条线程P、C,它们操作着同一个变量num,每次当num=0时,P线程就对num进行+1操作,每次num=1时C就对num进行-1操作。这就好比一个商家生产东西,一个客户买东西,商家生产一个,客户就买一个。然而线程之间是相互隔离的,我们要让两条线程能够做到对同一个资源进行操作,就必须要进行线程通信。public class ProductorAndCustomer { public static void main原创 2021-05-25 20:15:47 · 193 阅读 · 1 评论 -
3.Lock锁(重点)
了解Lock锁之前,先来回顾一下Synchronized卖票案例:生活中最典型的一个多线程的例子就是卖票,我们在买票的使用一般都是有多个窗口在同时卖票,对于每个售票窗口来讲,票的资源是共享的,因此,我们可以把每个售票窗口看作一个线程,而票就可以看成资源。public class Test { public static void main(String[] args){ //并发:多个线程操作同一个资源类 //资源类 SaleTickets tick原创 2021-05-25 18:11:04 · 192 阅读 · 0 评论 -
2.进程和线程、并发和并行
在学习JUC之前,我们需要了解下进程和线程的概念,以及并发和并行的区别。1、进程与线程:进程:一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,比如在Windows系统中,一个运行的xx.exe就是一个进程。由数据+代码+pcb(进程控制块)组成,一个进程往往至少包含一个线程。线程:是进程中的实际运作单位,假如我们使用qq聊天,发送信息的功能就是一个线程,也能收到信息功能也是一个线程。进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进原创 2021-05-25 15:37:17 · 313 阅读 · 1 评论 -
1.初识JUC
1、什么是JUCJUC就是java.util.concurrent,java.util.concurrent.atomic和java.util.concurrent.locks三个工具类包,它们是处理线程的工具包,最开始出现是从JDK 1.5开始出现。(JUC就是java.util.concurrent工具类的首字母,简称JUC)2、JUC的三大部分:SynchronizedLockThreadPool...原创 2021-05-25 13:52:09 · 78 阅读 · 0 评论