HashMap
HashMap基本概述HashMap,基于哈希表实现,继承了AbstractMap并且实现了Map接口。
12345678910111213public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>,Cloneable, Serializable{ //... //负载因子,默认大小是0.75 final float loadFactor; //用于记录HashMap所能容忍的键值对数量的临界值 int threadhold; //记录HashMap实际存在的键值对的数量 transient int size; //记录HashMap内部结构发生变化的次数 transient int modCount; //..}
threshold,用于确定在哈希表中触发扩容操作的阈值。也就是说,当实际存储的键值对数量超过了threshold时,HashMap将触发扩容操作,重新调整内部的桶的 ...
Redis分布式锁
Redis分布式锁概述所谓分布式锁,应当基本如下几项核心性质:
独占性:对于同一把锁,在同一时刻只能被一个取锁方占有,这是锁最基础的一项特征
健壮性:即不能产生死锁(dead lock). 假如某个占有锁的使用方因为宕机而无法主动执行解锁动作,锁也应该能够被正常传承下去,被其他使用方所延续使用
对称性:加锁和解锁的使用方必须为同一身份. 不允许非法释放他人持有的分布式锁
高可用:当提供分布式锁服务的基础组件中存在少量节点发生故障时,应该不能影响到分布式锁
服务的稳定性
setnx实现分布式锁时需要实现的两个基本方法:
获取锁:
互斥:确保只能有一个线程获取锁
123456SETNX lock thread1EXPIRE lock 10#添加锁,NX是互斥,EX是设置超时时间SET lock thread1 NX EX 10
释放锁:
手动释放
超时释放:获取锁时添加的一个超时时间
1DEL key
基于setnx实现简单的Redis锁lock接口
1234public interface MyLock{ public boolean tryLock(l ...
AQS
AQS概述AQS,全称Abstract Queued Synchronizer,抽象队列同步器,这个类在 java.util.concurrent.locks 包下面。Java并发包下面很多API都是基于AQS来实现加锁解锁等功能的,AQS是Java并发包的基础类。AQS为构建锁和同步器提供了一些通用功能的实现,因此,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue等等皆是基于 AQS 的。
AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制
12345public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializ ...
InnoDB数据存储结构
InnoDB数据存储结构页内部结构
名称
占用大小
说明
File Header
38字节
文件头·、描述页的信息
PageHeader
56字节
页头,页的状态信息
Infimum+Supremum
26字节
最大和最小记录
User Recordes
不确定
用户记录,存储行记录内容
FreeSpace
不确定
空闲记录
PageDirectory
不确定
页目录,存储用户记录的相对位置
File Trailer
8字节
文件尾
行格式修改行格式命令
123alter table example row_format=compact;show table status like 'example'\G
Compact行格式
变长字段长度列表
NULL值列表
记录头信息
row_id
trx_id
roll_ptr
n个数据列
变长字段列表
记录表中使用vachar声明的列实际存储的值的长度大小,例如:第一、三、五列实际长度为:8、4、6,那么长度列表中则记录为060408,逆序顺序
NULL值列表
采用二进制的值 ...
Thread类
Thread类概述 一个线程就是一个“执行流”。每个线程都可以按照顺序执行自己的代码,而多个线程可以“同时”执行多份代码。线程本身是操作系统中的概念。操作系统内核实现了线程这样的机制,并且对用户层提供了一些API供用户使用(例如Linux的pthread库)。而Java标准库中的Thread类可以视为是对操作系统提供的API进行了进一步的抽象和封装
Thread类是JVM用于管理线程的一个类。在Java中每个线程执行流都是通过Thread类的对象来描述。JVM会将这些Thread对象组织起来,用于线程调度、线程管理
使用Thread类,我们可以创建和管理多个线程,并且控制它们的执行顺序、优先级、暂停、恢复等
Thread的几个常见属性
属性
获取方法
ID
getId()
名称
getName()
状态
getState()
优先级
getPriority()
是否位后台线程
isDaemon()
是否存活
isAlive()
是否打断
isInterrupted()
ID是线程的唯一标识,不会重复
名称就是线程的命名
状态标识线程当前 ...
HTTP
HTTP概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则
状态码
状态码
作用
1xx
响应中-临时状态码,表示请求接收,告诉客户端应该请求或者它已经完成则忽略它
2xx
成功-表示请求已经被成功接收,处理已完成
3xx
重定向-重定向到其他地方,让客户端再发起一次请求已完成整个处理
4xx
客户端错误-处理发生错误,责任在客户端。如:请求了不存在的资源、客户端未被授权、禁止访问等
5xx
服务器错误-处理发生错误,责任在服务端。如:程序抛出异常
Get和PostGet
浏览器请求的URL中有参数部分,在浏览器生成的请求消息中,参数部分将附加在请求行中的资源路径后面。
“?”后面的内容为参数信息。参数是由参数名和参数值组成的,并且中间使用等号(=)进行连接。
如果URL地址中有多个参数,参数之间用“&”分隔。
需要注意的是,使用GET方式传送的数据量有限,最多不能超过2KB。
Post
当用户提交表单时,浏览器将使用POST方式提交表单内容,并把form表单的元素及数 ...
ThreadLocal
ThreadLocal概述ThreadLocal类用来提供线程内部的内部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型,用于关联线程和线程的上下文
作用:
提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数和组件之间一些公共变量的复杂度
常用方法几个ThreadLocal常用的方法
方法声明
描述
ThreadLocal()
创建ThreadLocal对象
public void set(T value)
设置当前线程绑定的局部变量
public T get()
获取当前线程绑定的局部变量
public void remove()
移除当前线程绑定的局部变量
ThreadLocal和Synchronized的区别都能处理多线程并发访问变量的问题,但是处理角度和思路不同
Synchronized
ThreadLocal
原理
同步机制采用“以时间换空间的方 ...
Java注解
Java注解javax.validation.constraints
@NotNull
不能为null,但可以为empty,一般用于判断Integer等基本数据类型,而且被其标注的字段可以使用@size、@Max、@Min对数值进行大小的控制
@NotEmpty
不能为null,长度必须大于0,一般用于集合类或者数组
@NotBlank
只能作用在接收的String类型上,不能为null,而且调用trim()后,长度必须大于0。即必须有实际字符
Java代理机制
Java代理模式概述代理模式是一种设计模式。简单来说就是我们使用代理对象代替对真实对象的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能
代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后,你可以增加一些自定义的操作
代理模式有静态代理和动态代理两种实现方式
静态代理静态代理中,我们对目标对象的每个方法的增强都是手动完成的,非常不灵活(比如接口一旦新增加方法,目标对象和代理对象都要进行修改)且麻烦(需要对每个目标类都单独写一个代理类)。 实际应用场景非常非常少,日常开发几乎看不到使用静态代理的场景。
静态代理实现步骤
定义一个接口及其实现类
创建一个代理类同样实现这个接口
将目标对象注入进代理类,然后在代理类的对应方法调用目标类中的对应方法。这样的话,我们就可以通过代理类频闭对目标对象的访问,并且可以在目标方法执行前后自定义操作
代码实例
定义支付接口
123public interface PayService{ String pay(String message);}
实现支付接口
123456p ...