摘要: 一、什么是JMM? JMM指的是Java内存模型,即 Java Memory Model Java内存模型并不是一种实际存在的东西,而是一种人为形成的约定,是一种概念。 关于JMM,我们需要了解一些相关的同步约定 : 线程在解锁前,必须将线程中的工作内存中存储的值即时刷新到主内存中的共享变量! 线程 阅读全文
posted @ 2021-07-15 23:53 夕立君 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 十五、异步回调 异步调用 类似于Ajax ⇒ 调用的结果不需要等待 Future 设计的初衷: 对将来的某个事件的结果进行建模 一般使用Future的增强类: CompletableFuture 常用的方法: runAsync(Runnable run) 没有返回值的异步回调 runAsync(Ru 阅读全文
posted @ 2021-07-15 17:42 夕立君 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 十四、ForkJoin 什么是fork join JDK1.7开始 并行执行任务!提高效率 ⇒ 针对大数据量 大数据 ⇒ MapReduce (把把任务拆分成小任务) ForkJoin 特点 : 工作窃取 已经执行完任务的线程会将尚未执行完的线程中的任务窃取过来,避免线程等待造成资源浪费 ⇒ 提高效 阅读全文
posted @ 2021-07-15 17:36 夕立君 阅读(60) 评论(0) 推荐(0) 编辑
摘要: 十三、Stream流式计算 程序员必备技能: lambda表达式 链式编程 函数式接口 (有且只有一个方法) Stream流式计算 什么是Stream流式计算 大数据 : 存储 + 计算 存储: 集合 数据库(MySQL) 计算都应该交给 Stream流来操作! package com.liu.st 阅读全文
posted @ 2021-07-15 17:32 夕立君 阅读(99) 评论(0) 推荐(0) 编辑
摘要: 十二、四大函数式接口(必须掌握) 程序员必备技能: lambda表达式 链式编程 函数式接口 (有且只有一个方法) Stream流式计算 函数式接口 Functional Interface : 只有一个方法的接口 @FunctionalInterface public interface Runn 阅读全文
posted @ 2021-07-15 17:31 夕立君 阅读(65) 评论(0) 推荐(0) 编辑
摘要: 十一、线程池(重点) 线程池 : 三大方法、7大参数、4种拒绝策略 池化技术 程序运行 ⇒ 本质:占用系统的资源! 如何优化资源的使用? ⇒ 池化技术 常用的池: 线程池 连接池 内存池 对象池 ... 注意: 经常创建、销毁 会造成资源浪费 池化技术: 事先准备好一些资源,如果有人要用,就从这里拿 阅读全文
posted @ 2021-07-15 17:25 夕立君 阅读(79) 评论(0) 推荐(0) 编辑
摘要: 十、阻塞队列BlockingQueue 队列 : FIFO 遵循先进先出原则 写入: 如果队列满了,就必须阻塞等待消费 取出: 如果队列是空的,必须阻塞等待生产 阻塞队列 BlockingQueue : 不是新的东西 具体的家族关系: JDK文档说明 重点使用的实现类: ArrayBlockingQ 阅读全文
posted @ 2021-07-15 17:18 夕立君 阅读(47) 评论(0) 推荐(0) 编辑
摘要: 九、读写锁 ReadWriteLock Read Lock 读锁 (共享锁)=> 允许多个线程一起读 读的时候不允许写操作 Write Lock 写锁 (独占锁)=> 只允许一个线程(独家)写的时候不允许读操作 读写锁的目的: 保证线程安全 读写分离 package com.liu.rw; impo 阅读全文
posted @ 2021-07-15 17:10 夕立君 阅读(38) 评论(0) 推荐(0) 编辑
摘要: 八、常用的辅助类(必会) 8.1、 CountDownLatch JDK1.8 文档说明: 本质: 减法 计数器 package com.liu.add; import java.util.concurrent.CountDownLatch; // 计数器 public class CountDow 阅读全文
posted @ 2021-07-15 17:08 夕立君 阅读(44) 评论(0) 推荐(0) 编辑
摘要: 七、 Callable 相较于Runnable来说,Callable ⇒ : 可以有返回值 可以抛出异常 方法不同, run() ⇒ Runnable、 call() ⇒ Callable 代码测试 package com.liu.callable; import java.util.concurr 阅读全文
posted @ 2021-07-15 16:56 夕立君 阅读(42) 评论(0) 推荐(0) 编辑
摘要: 六、集合类不安全 List 不安全 package com.liu.unsafeListOrSet; import com.liu.pc.A; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; // java. 阅读全文
posted @ 2021-07-15 16:51 夕立君 阅读(37) 评论(0) 推荐(0) 编辑
摘要: 五、8 锁问题 如何判断锁的是谁? 对象 、Class 深入理解 锁 package com.liu.lock8; import java.util.concurrent.TimeUnit; /** * 8锁 : 关于锁的八个问题 * 1. 标准情况下,两个线程先打印 发短信 还是 打电话 ? 1 阅读全文
posted @ 2021-07-15 16:43 夕立君 阅读(37) 评论(0) 推荐(0) 编辑
摘要: 四、synchronized 和 Lock的区别 重点! Synchronized 内置的Java关键字 Lock是一个Java类 Synchronized 无法判断获取锁的状态 Lock 可以判断是否获取到了锁 Synchronized 会自动释放锁,Lock必须手动释放锁!如果不释放则会导致死锁 阅读全文
posted @ 2021-07-15 16:40 夕立君 阅读(63) 评论(0) 推荐(0) 编辑
摘要: 三、Lock锁 (重点) 传统 Synchronized 相当于排队,队列 耦合性: 判断代码模块构成质量的属性,不影响已有功能,但影响未来拓展 ​ 耦合性越强,模块之间的联系越紧密,但独立性越差 Java编程追求的一条原则:高内聚 低耦合! Lock 接口 实现类: ReentrantLock 可 阅读全文
posted @ 2021-07-15 16:25 夕立君 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 一、什么是JUC? 学习方法: 源码 + 官方文档 面试高频问!! JUC: java.util.concurrent 并发包 包含三个子包 java.util 工具包 屏蔽同名 业务 : 普通的线程代码 Thread Runnable 没有返回值、效率相比 Callable 较低! Callabl 阅读全文
posted @ 2021-07-15 16:22 夕立君 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 共享变量的内存不可见性 多线程的内存模型 线程独有的工作内存(线程缓存 = > 提高工作效率)——所有线程共享的主内存 线程读取在主内存的成员变量,即共享变量的过程: 线程的工作内存会去读取主内存的成员变量并保存副本 线程在工作内存中修改副本 将修改后的副本的值推送给主内存并改写主内存中该变量的值 阅读全文
posted @ 2021-07-15 16:17 夕立君 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 为什么要使用线程池? 背景:经常创建和销毁、使用量特别大的资源,e.g,并发情况下的线程,对性能影响很大 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中 好处: 提高响应速度(减少用于创建新线程的的时间开销) 降低资源消耗(可重复利用线程池中的线程,不需要每次都创建) 便于线 阅读全文
posted @ 2021-07-15 16:16 夕立君 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 一、什么是线程同步? 多个线程操作同一个资源,即并发问题: 同一个对象被多个线程同时操作 多个线程访问同一个对象,某些线程还想修改对象的值,这时候会出现线程不安全的问题 线程同步是一种等待机制,即 多个需要同时访问此对象的线程进入对象的等待池 形成队列,等待前面线程使用完毕,下一个线程再使用 形成条 阅读全文
posted @ 2021-07-15 16:15 夕立君 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 一、区分多任务与多线程 多任务 : 同一时间处理多个任务 多线程 : 相当于开设了 多条通道,提高了CPU使用的效率 例子: 多个人同时登陆游戏 ​ 主线程-main方法 和 其他方法-子线程 同时运行 普通方法调用: 特点:只有主线程一条执行路径 多线程: 特点:多条执行路径,主线程和子线程并行交 阅读全文
posted @ 2021-07-15 01:34 夕立君 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 一、异常 Exception 简单分类 检查性异常 测试 程序员无法预见 运行时异常 编译时被忽略 错误 ERROR e.g.栈溢出 ⇒ JVM 有关 异常体系结构 Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类 在Java API中已经定义了许 阅读全文
posted @ 2021-07-15 01:26 夕立君 阅读(32) 评论(0) 推荐(0) 编辑