多线程相关知识点
一、多线程面试 线程的基础知识线程与进程的区别愚公移山,移不动,生孩子一起移,就是进程和线程的关系 一个进程可以包含一或多个线程 不同的进程使用不同的内存空间 当前进程下的所有线程可以共享内存空间 线程更轻量 并行和并发的区别 创建线程的方式有哪些 继承Thread类 实现Runnable接口 实现Callable接口(适合有返回值的情况) 使用线程池:创建一个固定大小的线程池,然后提交任务到线程池中执行 线程包含哪些状态 状态之间是如何变化的 新建 可运行 阻塞 没有抢到锁 等待 调用wait –> 别的线程notify唤醒 时间等待 调用sleep 终结状态 多个线程 如何保证按顺序执行 join方法:等待线程运行结束 notify和notifyAll的区别 wait和sleep的区别放下钥匙出门等待 和 抱着锁睡觉 如何停止一个正在运行的线程 退出标志 stop方法(作废) interrupt方法中断 打断阻塞的线程(sleep、wait、join),线程会抛出InterruptedException异常 打...
MySQL相关知识点
一、MySQL优化目录 1.1 慢查询 1.2 索引 1.3 SQL优化的经验 1.4 事务相关 ACID 1.5 并发事务带来的问题 1.6 undo log 和 redo log的区别 1.7 MVCC 1.8 主从同步原理 1.9 分库分表 1.1 慢查询1.1.1 如何定位慢查询?慢查询表象:页面加载过慢 解决方案一 开源工具调试工具:Arthas运维工具:Prometheus、Skywalking 解决方案二 MySQL自带慢日志慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息: 答: 介绍当时问题场景(压力测试时 某个接口响应时间很慢) 在mysql中开启了慢日志查询,设置2秒,一旦sql执行超过2秒就会被记录在日志中(调试阶段) 1.1.2 sql语句执行很慢 如何分析呢? 聚合查询(新增临时表) 多表查询(优化sql语句结构) 表数据量过大查询(添加索引) 深度分页查询 解决方案一 ...
MQ相关知识点
一、RabbitMQ1.1 什么场景下会使用MQ 异步发送 MySQL和Redis之间的数据同步 分布式事务 消峰填谷 解耦 异步 消峰 1.2 MQ如何保证消息不丢失消息发送过程 ~各个环节都有可能造成消息丢失~ RabbitMQ提供了publisher confirm机制,即发送方确认机制,保证消息不丢失。消息发送到MQ之后,会返回一个确认结果给发送方。如果发送方没有收到确认结果,则认为消息丢失。 正常发送到队列之后会返回一个ack publish confirm 如果失败: 发送到交换机失败:nack publish confirm 发送到队列失败:ack publish return 处理方法 使用生产者确认机制 回调方法即时重发 记录日志 保存到数据库然后定时重发 发送成功就删除表中的数据 消息持久化 交换机持久化 队列持久化 消息持久化 消费者确认机制 manual 手动ack auto 自动ack none 关闭ack 开启消费者失败重试机制 超过重试次数交给error交换机 交给人工处理 1.3 Rabbit重复消费问题怎么解决...
Java集合相关知识点
一、Java集合 List相关面试题 数组是一种用连续的内存空间存储相同数据类型数据的线性数据结构 例:int 是4字节,所以一个数字占4个空 寻址公式:a[i] = baseAddress + i * dataTypeSize 直接根据漂移量就能找到数组中的元素,所以数组访问速度很快 ArrayList源码分析 初始化ArrayList ArrayList<Integer> list = new ArrayList<>(); 创建空数组Object[] elementData = {}初始容量为10就算是 ArrayList list = new ArrayList(10); 那也只是创建了一个大小为10的数组,容量为10,并没有扩容 添加元素 list.add(1); 调用源码: public boolean add(E e) { modCount++; // 修改计数器 add(e, elementData, size); // 调用私有添加方法 return true;}private void add(...
