无题
大模型大模型的发展
类中的关系
对象之间的关系依赖依赖:表示一个类依赖另一个类,比如说驾驶员类Driver需要依赖汽车类Car才能行使。其中Car可以通过构造函数参数,方法参数,方法返回值,方法内局部变量的形式存在于Driver类中。
123456789public class Car{ public void startUp(){};}public class Driver{ public Driver (Car car){ car.startUp(); }}
类图
关联关联:表示一个类A与另一个类B之间的联系,它使类A知道类B的属性和方法。通常类B会以私有成员变量的形式存在于类A中。
关联关系有:
一对一
一对多
多对多类图
聚合聚合:是关联关系的一种,是强关联关系。聚合关系是整体和个体的关系。
一般关联关系的两个类处于同一层次上,聚合关机中的两个类处于不同层次,一个是整体,一个是部分
组合组合:是关联关系的一种,是比聚合关系更强的关系。要求普通的聚合关系中代表整体的对象负责代表个体的对象的生命 ...
单例模式
单例模式概述单例模式,顾名思义就是在整个运行是域,一个类只有一个实例对象
为什么需要单例模式呢?因为,有的类的实例对象的创建和销毁对资源来说消耗不大,
然而有的类比较庞大和复杂,如果平频繁的创建和销毁对象,并且这些对象完全是可以复用的话,那么将造成一些不必要的性能的浪费
比如:
现在需要访问数据库,创建数据库链接对象是一个耗资源的操作,并且数据库连接完全是可以复用的,那么就可以将这个对象设计成单例的,这样只需要创建依次并且重复使用这个对象就行了。
而不需要每次访问数据库都创建一个链接对象,如果那么做将是一个非常恐怖的事情
Java中的实现实现单例模式,需要考虑三点
是否线程安全
是否懒加载
是否反射破坏
懒汉式,线程不安全1234567891011public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { i ...
Java锁机制
Java锁机制概述在并发环境下,多个线程可能会对同一资源进行争抢,那么可能会导致数据不一致的问题,为了解决这个问题,从而引入锁机制
通过抽象的锁,对资源进行锁定
在Java中,每个object,也就是每个对象都拥有一把锁,这把锁记录在对象头中,锁中记录了对象被哪个线程所占用
Java对象Java对象包括了三个部分
对象头
实例数据
填充字节(其中对其填充字节是为了满足Java对象的大小必须是8比特的倍数这一条件设计的)
对象头包含两部分
Mark Word,存储了很多和当前对象运行时状态有关的数据
Class Point,一个指针,指向了当前对象类型所在方法区中的类型数据
Synchronizedsynchronized通过javac编译后会生成monitorenter和monitorexit,依赖这两个字节码指令实现线程同步
管程
首先Entry Set中聚集了一些想要进入monitor的线程,它们正处于waiting状态
此时假设线程A进入到了monitor,那么他就处于Active状态,假设A线程在执行途中遇到一个判断条件,需要他暂时让出执行权,那么他将进入到Wait S ...
ConcurrentHashMap
ConcurrentHashMap在JDK 8中ConcurrentHashMap存储结构如下,它由数组、单向链表、红黑树组成。
它在HashMap的基础上,提供了并发安全的实现,通过对指定Node加锁来保证更新的安全性。
构造函数12345678public ConcurrentHashMap(int initialCapacity) { if (initialCapacity < 0) throw new IllegalArgumentException(); int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ? MAXIMUM_CAPACITY : tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1)); this.sizeCtl = cap; } ...
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是线程的唯一标识,不会重复
名称就是线程的命名
状态标识线程当前 ...








