本文首发于 cartoon 的博客
转载请注明出处:https://cartoonyu.github.io/c…
java
-
sleep 与 wait 的区别
-
作用对象
- sleep 是 Thread 类的静态方法,作用于当前线程
- wait 是 Object 类的成员方法,作用于对象本身
-
作用
- 调用 sleep 方法,线程进入休眠状态
- 调用 wait 方法,线程进入阻塞状态
-
锁的释放
- sleep 不会释放持有的锁
- wait 会释放锁
-
唤醒
- 自然唤醒或者显式调用 interrupt 方法
- 调用 notify 或者 notifyAll 方法
-
调用
- sleep 不需要在同步代码中调用
- wait 需要在同步代码中调用,否则抛出 IllegalMonitorStateException
-
使用场景
- sleep 作用于周期性任务的执行
- wait 作用于互斥资源的使用
-
-
hashMap 的扩容机制
-
相关成员属性
-
HashMap 是 JAVA 集合框架的一个存储 key-value 对的实现类,有关于扩容机制的成员属性主要有三个
- 默认值为 16 的 capicity
- 默认值为 0.75 的 loadFactory
- 默认值为 0 的 size
-
-
触发时机
- 插入元素时
-
实现
-
JDK 1.7
- 传入 newCapicity 参数
- 新建 newCapicity 长度的 Entry 数组
- 将原数组元素重新 hash 放入新数组
- 将原有数组引用指向新数组
-
JDK 1.8 之后
- 如果节点的链表元素个数大于 8 时,原有的数组链表会转换成数组红黑树的逻辑结构进行使用
-
如果当前 size 大于 loadFactory*capicity 的阈值,触发扩容机制
- 新建一个 newCap 的 int 变量,大小为 2 *oldCapicity
- 新建一个大小为 newCap 的数组
- 原数组元素索引进行 2 次幂的计算放入新数组
- 将 newCap 赋值给原有的 capicity
- 返回新数组
-
-
-
ReentantLock 的了解
-
存在位置
- ReentantLock 是 JDK 的一个显式锁的 API,具体通过 AQS 队列实现功能
-
锁的种类
- ReentantLock 是可重入的锁,内部通过判断 state 当前占有线程进行重入的判断
- ReentantLock 可以实现公平锁以及非公平锁,在构造对象时显式传入 fair
-
同步机制
- ReentantLock 是同步非阻塞式的,采用乐观并发策略
- ReentantLock 需要显式控制锁的获取与释放,而且可以响应中断
-
-
List 实现类的比较
-
底层实现
- Arraylist 为数组
- LinkedList 为链表
-
线程安全
- ArrayList,LinkedList 为线程不安全
- Vector 为线程安全
-
实现时间
- ArrayList,LinkedList 为 JDK1.2 开始实现
- Vector 为 JDK1.1 开始实现
-
-
NIO 的了解
- NIO 是 java 中用于实现数据的输入 / 输出的 API,是同步非阻塞式的
-
核心对象
- selector,选择器,用于对 channel 的选择
- channel,通道,用于连接 java 程序与对象的通道
- buffer,缓冲区,用于数据的暂时存放
-
工作步骤
- java 程序与操作对象建立 channel
- 数据放入 buffer 中
- selector 轮询 channel,监控 IO 状况,控制输入输出
-
ConcurrentHashMap 同步的实现(JDK1.7 1.8)
-
JDK1.7 实现
- ConcurrentHashMap 中数据存放在 Segment(默认为 16 个)中
- ConcurrentHashMap 为区域锁,锁定对象是 Segment
- 在写数据时,会经过计算得出使用的 Segment,并检查是否持有 Segment 的锁
-
JDK1.8 实现
- ConcurrentHashMap 中数据存放在数组链表 / 红黑树中
- ConcurrentHashMap 是行级锁,锁定对象是链表的头结点或者红黑树的根结点
- 在写数据,计算访问的数据索引,检查锁,访问链表或者红黑树
-
JVM
-
G1 的工作流程
- 初始标记
- 并发标记
- 最终标记
- 筛选回收
-
CMS 的工作流程
- 初始标记(stw 现象)
- 并发标记
- 重新标记(stw 现象)
- 并发清理
- 重置线程
Spring
-
spring bean 的生命周期
- 对象被实例化
- Spring 进行 IOC 的注入
-
可选
-
传入对象
- 实现 BeanNameAware 接口,传入 bean 的 ID
- 实现 ApplicationFactoryAware 接口,传入 Spring 工厂
- 实现 ApplicationContextAware 接口,传入 Spring 上下文
-
初始化
- 实现 BeanPostProcessor 接口,对 bean 内容进行修改
-
- 使用
- 清理
网络
-
输入域名到返回页面的过程
-
浏览器部分
- 利用 DNS 进行域名解析
- 检查本地 host 文件
- 组装 http 报文
- http 报文经过 OSI 底层包装发送请求
- http 请求在第三次 tcp 握手上发送
-
传输
- 路由器根据 IP 进行选择转发到目标主机
- 目标主机
- 后端进行报文的拆解获取真实请求
- 根据请求返回相应页面
- 传输
- 路由器根据 IP 进行选择转发到目标主机
- 源主机
- 拆解报文,获取实部数据
- 交给浏览器渲染页面
-
算法
- 两数之和(leetcode 1)