多线程
线程和进程的区别
线程是CPU调度的基本单位
进程是程序的一次执行过程,是程序执行的基本单位
Spring源码
ApplicationContext的功能 继承多个接口
BeanFactory :能够管理装配Bean
ResourcePatternResolver:能够加载资源文件
MessageSource :能够实现国际化
APplicationEventPublisher:注册监听器,实现监听机制
IOC
Spring Bean的作用域
singleton 默认作用域 容器里拥有唯一Bean实例 单例模式
prototype 每一个getBean请求,容器都会创建一个Bean实例
AOP
原理 使用代理类来替换真实实现类以对外提供服务
代理模式 :接口+真实实现类+代理类
ACID 原子性、一致性、隔离性、持久性
、隔离级别、事务传播
MySQL
架构
一般索引为B+Tree索引,存储引擎为InnoDB
事务
事务
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。
四大特性
原子性 买就买,不买就拉到
一致性 你买我卖
隔离性 你买你的,我买我的
持久性 你买了就是你的了
事务隔离级别
读取未提交读、读取已提交读、可重复读、可串行化
MySQL默认REPEATABLE-READ事务隔离级别,Oracle默认READ-COMMITTED
事务并发访问引起的问题
更新丢失(MySQL任意级别),脏读(COMMITTED以上可避免),不可重复读(REPEATABLE-READ以上避免),幻读(SERIALIZABLE最高级别避免)
索引
索引越多越好吗
- 索引不是越多越好
- 数据量小的表用不到,建了还增加索引开销
- 数据变更需要维护索引,增加索引维护成本
- 更多的索引意味着更多的空间
锁
共享锁(S锁)和排它锁(X锁)
共享锁【S锁】
又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
排他锁【X锁】
又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A
Gap锁
对主键索引或者唯一索引会用Gap锁吗
如果where条件全部命中,则不会用Gap锁,只会加记录锁;反之亦然
Gap锁会用在非唯一索引或者不走索引的当前读中
RC、RR级别下的InnoDB的非阻塞读如何实现
数据库有着三个隐藏的字段,通过这三个字段,通过这些字段我们实现了记录追踪,历史回朔
- 数据行里的DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID字段
- undo日志(每操作一次数据,顺序增加一个日志)
- read view(快照本照了)
数据行DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID字段
-
DB_TRX_ID(最后一次操作事务ID)
-
DB_ROLL_PTR(回滚指针)
-
DB_ROW_ID(InnoDB表中在没有默认主键的情况下会生成一个6字节空间的自动增长主键)
-
undo日志
第一次修改数据12->32
第二次修改数据13->45
我们看到日志被记录下来,如果 我们第二次事务回滚了,是找到回滚指针指向的undo日志,再回滚操作
-
read view
RR下,事务读取数据的时机非常重要,第一次读取后数据会创建快照,以后会读取快照,事务提交前,再读取都是读取第一次读取的数据
RC下,每一次数据读取,都会创建一个新的快照,所以RC能读取到别人提交的结果
算法
字符串
trim() 去掉字符串首尾空格
String str= str.trim();
去掉字符串所有空格
String str= str.replaceAll(" “,”");
isDigit() 方法用于判断指定字符是否为数字。
public static boolean isDigit(char ch)
Character.isDigit(ch);
charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。
public char charAt(int index)
s.charAt(index)