基础
synchronized
synchronized修饰普通类是对这个类的实例进行加锁,这个类其他的实例还是可以继续访问的
synchronized修饰静态类,是对这个类对象进行加锁,除了该线程,其他的所有线程都不可访问此对象
synchronized方法和synchronized代码之间没有区别,只是修饰方法更便于理解
synchronized(this){}代码块可以更精确的控制访问区域,他的作用域是当前对象
volatile
1.保证可见性
2.防止指令重排
3.但是不保证原子性
可见性:在JMM(java memory model)java内存模型中,其他线程从主内存空间把值拷贝到自己的工作空间,线程修改之后的值会返回给主内存,主内存会通知其他线程,此为可见性。
Java锁
锁对象大致分为3部分:对象头、实例变量和填充字节
synchronized对应重量级锁
锁的4种状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态(级别从低到高)
锁可以升级但是不能降级,偏向锁可以设置为无锁状态
偏向锁:
优点:加锁无需额外的消耗,和非同步方法相差纳秒级
缺点:如果竞争的线程多,那么会带来额外的锁撤销的消耗
适用场景:基本没有线程竞争锁的同步场景
轻量级锁:
优点:竞争的线程不会阻塞,使用自旋,提高程序响应速度
缺点:线程阻塞,响应时间长
适用场景:适用于少量线程竞争锁对象,且线程持有锁的时间不长,追求响应速度的场景
重量级锁:
优点:线程竞争不使用CPU自旋,不会导致CPU空转消耗CPU资源
缺点:线程阻塞,响应时间长
适用场景:很多线程竞争锁,锁的持有时间长,追求吞吐量的场景
锁粗化:按理来说,同步块的作用范围应该尽可能小,仅在共享数据的实际作用域中才进行同步,这样做的目的是为了使需要同步的操作数量尽可能缩小,缩短阻塞时间,如果存在锁竞争,那么等待锁的线程也能尽快拿到锁。
但是加锁解锁也需要消耗资源,如果存在一系列的连续加锁解锁操作,可能会导致不必要的性能损耗。
锁粗化就是将多个连续的加锁、解锁操作连接在一起,扩展成一个范围更大的锁,避免频繁的加锁解锁操作
锁消除:Java虚拟机在JIT编译时,通过对运行上下文的扫描,经过逃逸分析,去除不可能存在共享资源竞争的锁,通过这种方式消除没有必要的锁,可以节省毫无意义的请求锁时间
悲观锁:synchronized和ReentrantLock。
乐观锁:1.版本号机制: 2.CAS算法
大数量的查询和删除的处理方式
异步,批量处理
数据结构
HashMap
hashMap的重要属性
int threshold 阈值(capacity*loadFactor)
Entry[] table 存储元素的数组(就是数组+链表中的数组)
int size 存储元素的个数(非数组长度,数组下面链表中元素之和)
final fload loadFactor 负载因子,默认0.75
int modCount 记录结构构型修改次数,用于快速失败
static calss Entry<K,V>{
final K key; 节点的key值
V value; 节点的value值
Entry<K,V> next; 下一个节点的引用(也是跟这个Entry<K,V>一样?)
int hash; 节点的hash值
}
hashMap初始数组长度为16,jdk1.8之前数据结构为数组+单链表,jdk1.8之后变为数组+单链表+红黑树,在长度大于8的时候会变为红黑树(也就是在9的时候进行了一次扩容)
hashMap允许key,value为null,但不允许同时为null,key为null的存取都在数组table[0]
考点: 负载因子 final float loadFactor默认0.75
HashMap和HashTable的区别
1.HashMap线程非同步,HashTable线程同步 (用synchronized修饰)
2.HashMap允许key,value有空值(不能同时为空),HashTable的key和value均不能为空
3.HashMap使用Iterator,HashTable使用Enumeration迭代器
4.HashMap的默认大小是16,扩容后是2的指数倍,HashTable默认大小是11,扩容大小为old*2+1
5.HashMap继承自AbstractMap, HashTable继承自Dictionary类(父类不同,但同时实现了Map接口)
Spring
spring设计模式
1.工厂模式:Spring的BeanFactory类,就是使用了简单工厂模式。它主要提供getBean()方法,用来创建对象的实例;我们见得比较多的ApplicationContext也是继承自BeanFactory
2.单例模式:Spring中的Bean默认为singleton单例。我们可以通过配置Bean的作用域scope参数来进行修改.Spring Bean一共有5种内置的作用域,分别是singleton、prototype、request、session、globalSession
3.装饰者模式:在Spring中,只要见到以Wrapper命名的类基本都是使用装饰器模式。比如BeanWrapper,用来访问Bean的属性和方法
4.策略模式:Spring中Bean的实例化采用的就是策略模式。因为Bean的实例化包含原生对象的实例化,和代理对象的实例化,不同对象实例化的逻辑也不一样,所以实例化策略也不一样,比如SimpleInstantiationStrategy就是Spring中默认的实例化策略
5.适配器模式:在Spring,只要是以Adapter命名的类基本都是适配器模式的应用。比如MVC模块中HandlerAdapter
6.代理模式:比如AOP模块中的AopProxy,用到了JDK的动态代理和CGLIB字节码生成技术
7.模板方法模式:主要用来解决代码重复的问题。Spring提供了非常多的模板类来减少重复代码,基本都是以Template结尾,比如RestTemplate,JmsTemplate,JdbcTemplate
8.观察者模式:主要用于当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知,在Spring中一般Listener结尾,比如ApplicationListener等等
总结:Spring是一个非常经典的框架,它用的的设计模式也非常多。而且很多设计模式经常是混合使用的,都是你中有我,我中有你。所以,我们在阅读代码的时候,还不能简单地断定某个类就一定是只用了某一种设计模式
SpringIOC
利用反射技术,根据spring.factory文件中的全限定类型生成bean注册表,最后生成bean放入缓存池
SpringAOP
spring的扩展点
自定义拦截器: 实现HandlerInterceptor接口
获取容器对象:通过ApplicationContext的getBean()
@ControllerAdvice全局异常处理
导入各种配置:@Import @ImportResource @PropertySource
项目启动要做的处理:比如你打印的佛像,icon
AOP注解的@After,@Before等可以操作
Mybatis
mybatis分页机制
1.用SQL语句的limit关键字(物理分页)
2.RowBounds(逻辑分页)
3.第三方插件PageHelper(物理分页)
mybatis插件原理
MyBatis针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,使用JDK的动态代理,拦截指定需要拦截的方法
Redis
Mysql
MySQL锁
按兼容性划分:共享锁(S Lock)、排他锁(X Lock)
按锁粒度划分:表锁、行锁
按锁模式划分:记录锁、间隙锁、临键锁、意向锁、插入意向锁
按加锁机制划分:乐观锁、悲观锁
共享锁:也叫读锁,读读共享
排他锁:也叫写锁,均不共享
行锁:InnoDB通过给索引上的索引项加锁实现的,会出现死锁,开销大,加锁慢
sql优化
利用插件打印慢sql日志,记录接口执行时间,explain查询sql
批量处理数据,多用程序处理数据
利用缓存优化查询
分布式
CAP理论
CAP:一致性、可用性和分区容错性,最多同时满足2个
在分布式系统中,网络分区是不可避免的,一致性和可用性无法同时满足
分布式事务
服务注册发现
分布式锁问题
微服务
ZooKeeper
Linux
文件操作
创建文件夹:mkdir mkdirs mkdir -p
创建文件: vi vim touch
解压:unzip tar -zxvf
重命名:mv oldFile newFile
移动:mv oldPath newPath
删除:rm -rf
unzip xxx.zip #解压zip文件到当前文件夹
zip -r data.zip data #压缩data目录为zip文件
unzip data.zip -d databak #把/home目录下面的data.zip解压到databak目录里面
zip -r a123.zip a 3.txt #把/home目录下面的a文件夹和3.txt压缩成为a123.zip
unzip -j w.zip #把/home目录下面w.zip里面的所有文件解压到第一级目录
mkdir package #创建文件夹
rm -rf /home/packageA #删除文件夹及其下面的所有文件
cp -r /home/packageA/* /home/cp/packageB/ #将A文件夹下所有内容复制到B文件夹下
cp -r /home/packageA/. /home/cp/packageB/ #将A文件夹下所有内容复制到B文件夹下
文件搜索
cat tail head less file
cat/tail/head/less/file filename | grep 关键字
软硬连接
ln #创建硬链接和符号链接
1.硬链接:当创建 一个硬链接的时候,也为这个文件创建了一个额外的目录条目。硬链接不能引用自身文件系统之外的文件。也就是说,链接不能引用与该链接不在同一磁盘分区的文件。硬链接无法引用目录。
ln f link #f表示文件
2:符号链接:符号链接是通过创建一个特殊类型的文件来起作用的,该文件包含了指向引用文件或目录的文本指针。(类似于Windows的快捷方式)。
ln -s item link #item表示文件或目录
防火墙
firewall-cmd --state
systemctl start firewalld.service #开启防火墙
systemctl restart firewalld.service #重启防火墙
firewall-cmd --reload #重新载入配置
firewall-cmd --zone=public--add-port=8080/tcp --permanent #开启8080端口防火墙
Docker
使用命令
systemctl start docker.service #启动docker
systemctl enable docker.service #设置docker自启动
systemctl status docker.service #查询docker运行状态
docker version #docker版本
docker images #查看docker镜像列表
systemctl status docker.service #查询docker运行状态
docker pull 服务名 #安装最新版的xx服务
docker rm/rmi containerId #删除容器
业务
讲下业务 数据流向 痛点呀 解决方式呀 亮点
数据流向:小程序-华为云服务器-AES-跑皮机-集成查看
痛点:
亮点:代码、数据库设计(精简字段、冗余字段、表拆分)
其他
git操作
pull push merge checkout cherry revert