Java知识体系总结
2020-04-10 10:19:23 0 举报
AI智能生成
为你推荐
查看更多
知识点总结
作者其他创作
大纲/内容
java知识点
java基础
JDK
概念
面向对象
用途
开发JAVA程序,运行JAVA程序
组成部分
java开发工具包,包含各种类库和工具
JRE
运行JAVA程序
核心内容是JVM及核心类库
==和equals的区别
两个对象的hashCode()相同,则equals()也一定为true,对吗?
两个对象的equals()为true,hashCode()一定相同;hashCode()相同equals()不一定为true;
final关键字的作用
作用
1.用于修饰类,修饰类属性,修饰类方法。
2.被final修饰的类不可以被继承;被final修饰的类属性和类方法都不能够被重写;被final修饰的类属性,子类不能给它重新赋值。
String属于基础的数据类型吗?
String不属于数据类型,是final修饰的类
操作字符串的类
String
String是不可变的对象,在每次对String类型进行改变时都会新生成一个对象
StringBuffer
对对象的改变不会产生新的对象,效率比StringBuild慢,但线程安全
StringBuild
不产生新对象,线程不安全,效率高
面向对象程序设计
特点
封装
将对象的属性和行为封装起来
继承
多态
父类对象应用于子类
实现形式
继承和接口
存在的三个必要条件
重写
子主题
Java语言的优势
一处编译到处运行
Spring Boot
提倡约定优先于配置
\b目的
简化spring初始化搭建以及开发过程
优点
1.开箱即用,提供各种默认配置来简化项目配置
2.内嵌WEB容器
3.没有冗余代码生成和xml配置的要求
Starter作用
主要目的是为了简化依赖
eg:spring-boot-starter-web里面包含各种依赖
\bspring-boot-starter-web作用
springweb核心组件
SpringApplication.run方法的原理
\bNoSql数据库
\bRedis
nosql缓存数据库
特征
3.效率高(内存查询效率比查询硬盘效率高)
4.数据容易丢失
\b优点
1.能够减轻数据库压力
\b原因
查询内存比查询硬盘效率更高
2.
基本数据类型
string
深入理解
set不允许重复,无需
\bString类型的无序的,不能重复的集合
zset不允许重复有序
hash
list
2.如果健不存在,创建新的链表
3.如果键存在,新增内容
4.如果值全部移除,对应的键也消失了
5.对链表的头和尾操作效率都很高,对中间元素操作效率很低
redis如何存储对象
首先将对象转成json格式存放在redis中,通过反序列化成对象
\b分布式锁
\b分布式锁遇到的问题
1.服务挂掉锁没有释放
2.redis挂了
\b解决方式
\b手动删除Kkey
释放锁遇到的问题
1.业务代码执行时间超过锁的超时时间
A线程将B线程的锁删除
\b如何实现分布式锁
\b缺点
2.采用lua脚本操作分布式锁
\bredis高可用机制
1.主从复制
数据备份,读写分离,集群,高可用,宕机容错
\b如何实现
1.哨兵机制
1.主要用与选举master
应用场景
持久化机制
1.RDB
是什么?原理
1.redis首先会fork一个与当前线程一模一样的子进程来进行持久化,这个子线程的变量(环境变量,程序计数器等)都和原线程一模一样,首先将数据写入一个临时文件,待持久化结束了,再将这个临时文件替换之前持久化好的文件。
提问?为什么要fork一个子进程?
什么时候fork子进程,什么时候出发rdb持久化机制
1.shutdown时,如果没有开启aof,会出发rdb
2.配置文件默认快照配置
3.执行sava或者bgsave
bgsave会fork一个子进程
sava不会fork子进程直接使用主进程进行持久化,是阻塞的
2.AOF
是什么?原理
将redis的操作日志以追加的方式写入文件,读操作不做记录
主要分为三步:数据写入内存->数据写入aof_buf ->写入持久化文件
触发机制
no
表示等操作系统进行数据缓存同步到磁盘
快,持久化没保证
always
同步持久化,每次发生数据变更时,立即记录到磁盘
慢,安全
everysec
表示每秒同步一次
默认,很快,但是可能会丢失一秒内的数据
aof重写机制
\b为什么会出现重写机制?
原理
1.当aof文件增长到一定大小的时候redis能够调用bgrewriteaof对日志文件进行重写
2.当aof文件大小的增长率大于配置项时自动开启重写 默认是100
3.当aof文件大于该配置项时自动开启重写
注意:注意:重写操作是通过fork子进程来完成的,所以正常的aof不会fork子进程,触发了重写才会
4.0之后混合持久化机制
\b小总结
redis提供了rdb持久化方案,为什么还要aof?
如果aof和rdb同时存在,听谁的
aof
rdb和aof优势和劣势
aof根据配置项设置,一般不会丢失超过两秒的数据
Redis主从复制
单机有什么问题
单机故障
容量瓶颈
qps瓶颈
1.读写分离
2.容灾备份
\b命令传播阶段出现断网
1.网络闪断闪连,忽略
全量复制核心三个条件
2.主服务器挤压的命令缓冲区,先进先出队列
3.主从服务器的偏移量,对比偏移量,然后判断执行全量还是增量
当主服务器宕机之后,将不能进行写操作,需要手动将从机升级到主机
Redis哨兵模式
作用,是什么
\b主要是为我们解决master选举的问题
\b功能
1.监控,哨兵会不断的检查主节点和从节点是否正常运作
2.自动故障转移
3.配置提供者,客户端在初始化时,通过连接哨兵来获得当前redis服务的主节点地址.
4.通知,哨兵可以将故障转移结果发送给客户端
架构
哨兵节点
\b哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据
\b数据节点
主节点和从节点
基本原理(重要)
主管下线
\b客观下线
选举算法(Raft算法)
\b选举sentinel
\b故障转移
原则
1.首先过滤掉不健康的从节点
2.过滤掉响应慢的节点
3.过滤掉与mater断开时间最久的
\bredis Cluster
指派槽
通过crc16算法算出key的槽位
MongoDB
存储json格式
memercache
没有高可用,没有持久化
缓存的几大问题
\b缓存颗粒度
解决方式
缓存穿透
产生原因
\b多次请求不存在的key
1.创建缓存空对象
2.使用布隆过滤器
Google布隆过滤器的缺点
Redis布隆过滤器
不担心重启即失效或者需要定时任务去维护的成本
缺点
\b缓存击穿
解决方案
分布式锁
\b缓存雪崩
3.不同的key设置不同的过期时间
\b关系型数据库
Mysql
数据库设计
三范式
1.原子约束,每列不可再分
2.保证唯一性,如主键
3.不要有冗余数据
分库分表
分库
条件
服务拆分,每个小项目有独立数据库,互不影响
\b分表
\b条件
按年存放日志
应用
1.使用一张大表专门存储所有数据
2.取模算法实现分表,均匀分配
1.分页查询
2.查询非常受限
解决方式:\b使用视图合成一张表
\b概念
\b关系型数据库管理系统
SQL优化
慢查询
默认语句超过10s未响应的查询为慢查询
查询慢查询次数
show status like 'slow_queries'
查询慢查询时间
show variables like 'long_query_time'
SQL语句优化
1.首先通过执行计划定位慢查询
2.添加索引
SQL优化技巧
1.在group by 后面增加 order by null 就可以防止排序,提高效率
2。使用连接来替代子查询,不会在内存中创建临表
3.对查询进行优化,避免全表扫描,在where以及orderby涉及的列上建立索引
4.避免在where字句中对字段进行null值判断,容易导致引擎放弃使用索引,进行全表扫描
补充:尽可能使用not null填充数据库,char()型 null也占用空间
数据引擎
MyISAM
1.MyISAM不支持事务
2.MyISAM批量插入速度快
3.表级锁
4.支持全文索引
INNODB
1.INNDB支持事务
2.5.6之后支持全文索引
3.一般行级锁,update table set id=3 where name like 'a%';)全表锁
如何选择
可靠性要求高,或者要求支持事务
想要用到外检约束的时候
\b索引
单独的,存储在磁盘上得数据库结构,指向表中所有记录的引用指针,是一种排好序的数据结构
底层结构
B+树,属于折半查找
增加,删除,索引文件也需要更新,占内存
提高查询效率
使用条件
1.查询次数比较多,非常多不同值的字段
2.where条件需要查询的,值非常多不同
种类
主键索引
primary key
alter table 表明 add primary key(列名)
唯一索引
unique
alter table 表名 add unique 索引名(列名)
组合索引
全文索引
将存储在数据库中得文章或者句子等任意内容信息查找出来的索引,单位是词
添加全文索引
alter table command add fulltext(instruction)
使用全文索引
select * from 表名 match 字段名 against ('检索内容')
普通索引
index
\bcreate index 索引名 on 表名(列名)
关系型数据库特征
1.持久化
2.主外键
3.sql语句
Web安全
表单重复提交(模拟http请求)CSRF
网络延迟,刷新,回退
前端
点击按钮之后置灰
后端
\b使用验证码+token令牌
XSS攻击(脚本注入)
输入js脚本,提交
1设置过滤器拦截所有请求
2重写获取值的方法,将特殊字符转成html
防盗链
判断请求来源
对称加密
加密解密过程
优缺点
注意事项
非对称加密
非对称加密算法又称现代加密算法
\b优缺点
两者之间的对比及应用场景
对称加密只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。 非对称加密有两种密钥,其中一个是公开的。
由于RSA算法的加密解密速度要比对称算法速度慢很多,在实际应用中,通常采取 数据本身的加密和解密使用对称加密算法(AES)。 用RSA算法加密并传输对称算法所需的密钥。
\b设计模式
\b主要作用
重复利用,代码易于扩展,提高代码阅读性,减少代码
设计模式六大原则
\b开闭原则
\b扩展性,易于修改
里式代换原则
接口隔离原则
\b接口隔离,降低类之前的耦合度
\b依赖倒转原则
\b面向接口编程
迪米特法则
保持类的相对独立性
合成复用原则
代码复用
\b常见的设计模式23种
单例
保证一个jvm中只有一个实例
懒汉式
线程不安全,需要的时候才会实例化
\b恶汉式
线程天生安全,jvm class类加载的时候就初始化
\b工厂设计模式
\b代理设计模式
\b适配器设计模式
\b包装设计模式
\b集合
二叉查找树
\b时间复杂度
O(logn)最坏情况为O(N)
二叉查找树存在的问题
树倾斜
\b平衡二叉查找树
AVL树
\b红黑树
2.根结点是黑得
3.每个叶结点是黑的
插入数据
1.将新结点的color赋为红色
\b以BST的插入方法到红黑树中.
HashMap
数据结构
1.7数组+链表
1.8数组+链表+红黑树
1.8的HashMap为什么要使用红黑树?
HashMap什么时候将链表转为红黑树?
原因
1.8中HashMap得put方法的实现过程
1.首先根据key生成对应的hashCode
4.判断数组的第i个位置的元素是否为空
b.如果不为空
modCount++
HashMap的元素个数size+1
1.8中HashMap的get方法的实现过程
1.根据key生成hashCode
4.如果数组的第i个位置上没有元素则直接返回空
JDK7与JDK8中HashMap的不同点
1.JDK8使用了红黑树
ConcurrentHashMap
JDK7ConcurrentHashMap是如何保证并发安全的
1.主要是利用Unsafe操作+ReentrantLock+分段思想
主要使用了Unsafe操作中的
compareAndSwapObject:通过cas方式修改对象的属性
2.putOrderedObject:并发安全的给数组某个位置赋值
3.getObjectVolatile:并发安全的获取数组某个位置的元素
分段思想的目的
JDK7中的ConcurrentHashMap的底层实现原理
底层是由两层嵌套数组实现的
JDK8ConcurrentHashMap是如何保证并发安全的
1.主要是利用unsafe操作+synchronized关键字
synchronized主要负责在需要操作某个位置时进行加锁(该位置对象不为空)
\b如果该位置有元素,则synchronized会加锁
添加成功判断是否需要树化
同时一个线程在put时如果发现当前concurrntHashMap正在扩容会帮助扩容
两个不同点
JDK8中没有分段锁了,而是使用synchronized来进行控制JDK8中的扩容性能更高,支持多线程同时扩容,实际上JDK7中也支持多线程扩容,因为JDK7中的扩容是针对每个Segment的,所以也可能多线程扩容,但是性能没有JDK8高,因为JDK8中对于任意一个线程都可以去帮助扩容JDK8中的元素个数统计的实现也不一样了,JDK8中增加了CounterCell来帮助计数,而JDK7中没有,JDK7中是put的时候每个Segment内部计数,统计的时候是遍历每个Segment对象加锁统计(当然有一点点小小的优化措施,看视频吧..)。
\b中间件(完善中)
在消息的传输过程中保存消息的容器(利用高效可靠的消息传递机制进行与平台无关的数据交流)
目的
提供路由并保证消息传递
\b注意点
1.采用异步处理模式
2.应用程序和应用程序调用关系为松耦合关系
\b传递模型
点对点模型(PTP)
接收者在成功接收消息之后需向队列应答成功
发布-订阅模型(Pub/Sub)
定义了如何向一个内容节点发布和订阅消息(内容节点只主题)
每个消息可以有多个消费者
\b消息
由消息头和消息体组成
交换器
用来接收生产者发送的消息并将这些消路由给服务器中得队列
类型
famout广播
Queue消息队列
交换器和队列之间的关系
Rabbitmq消息处理
\bACK机制
\bmybatis(完善中)
mybasit与hibernate的区别
1.mybatis是以sql语句得到对象
2.hibernate是以对象得到sql语句
Sql注入问题
一级缓存
\b二级缓存
JVM
概念:一种能够运行java字节码的的虚拟机
基本结构
类加载子系统
运行时数据区(内存结构)
执行引擎
类加载机制(要答三个)
类的生命周期
加载.class文件读取到内存
连接:
验证字节码文件格式的正确性
准备:
给类的静态变量分配内存,并由虚拟机赋予默认值
解析:
类装载器装入类所引用的其他所有类
初始化各种静态变量和执行静态代码块
上述的准备阶段为静态变量赋予的是虚拟机默认的初始值,此处赋予的才是程序编写者为变量分配的真正的初始值,执行静态代码块
使用
卸载
类加载器的种类:
启动类加载器Bootstrap JVM内部实现通过c++编写
负责加载jre的核心类库,rt..jar...charsets.jar
\b扩展类加载器ext
负责加载jre扩展目录ext中Jar类包
系统类加载器AppClassloader
负责加载classpath路径下得类包
用户自定义加载器
负责加载用户自定义路径下得类包
类加载机制
全盘负责委托机制
当一个ClassLoader加载一个类的时候,除非显示的使用另一个ClassLoader,该类所依赖和引用的类也由这个ClassLoader载入
双亲委派机制
指先委托父类加载器寻找目标类,在找不到的情况下在自己的路径中查找并载入目标类
双亲委派机制的优点:
1.沙箱安全机制
2.避免类的重复加载
java内存结构(运行时数据区)
jvm虚拟机存储空间
方法区:
jdk 1.8之前叫永久区,1.8之后叫元空间
常量池
用于存放编译器生成的各种字面量和符号引用
字面量
String s1=\"hello\";\"hello\" 为字面量
\b特点
受到方法区内存的限制,容易抛OOM
堆:
概念:
特点:
\b 新生代
Eden区
刚创建的对象存放
Survivor space
From区
To区
老年代
元空间(1.8之后代替了永久代)
对JVM规范中方法区的实现,不存在虚拟机中,存在于本地内存.
为什么移除永久代?
移除永久代是为融合HotSpot与 JRockit而做出的努力,因为JRockit没有永久代,不需要配置永久代
栈
作用于方法执行的一块Java内存区域
一个线程对应一个栈,每个方法在执行的同时都会创建一个栈帧(用于存储局部变量表,操作数栈,动态链接,方法出口等信息)不存在垃圾回收问题,只要线程一结束该栈就释放,生命周期和线程一致
本地方法栈
为JVM执行native方法服务
登记native方法,在Execution Engine执行时加载本地方法库
程序计数器
下一次执行的内存指针
对象创建的底层步骤
3.为这个新生对象在java堆中分配内存.
指针碰撞
开辟一块内存
移动指针
存在的问题
空闲列表
修改空闲列表
同上
4.将分配到得内存空间都初始化为零值
5.设置对象头的相关数据
1.GC分代年龄
2.对象头的hashCode
3.元数据信息
6.执行对象的init方法(静态代码块)
GC算法和收集器
判断对象存活算法
引用计数法
引用一次计数器加1,失效一次计数器减一
可达性分析算法
基本思想
通过GC Roots对象作为起点,向下搜索,节点走过的路径叫做引用链
引用链概念
节点走过的路径
当一个对象到GC Roots没有任何引用链相连的话,则证明此对象是不可用的
可作为GC Roots对象
如何判断一个常量是废弃常量?必然进行回收
当没有任何对象引用该常量
如何判断一个类是无用的类,可以进行回收?
该类的所有实例都已经被回收
加载该类的类加载器已经被回收
该类对应的java.lang.Class对象没有在任何地方被引用,无法通过反射访问该类的方法
垃圾回收算法
\b 标记-清除算法
首先标记需要回收的对象,最后统一回收。
缺点:
标记和清除的效率低
不是连续的,容易产生碎片化
复制算法(为了解决效率问题)
每次只使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块区,然后再把使用的空间一次清理掉
效率较高
连续性不产生碎片化
可使用的内存变为原来的一半
\b标记-整理算法(用于老年代)
标记需要清除的对象,然后把存活的对象压缩到内存一端,而后进行垃圾回收
分代收集算法
根据不同的年代采取不同的算法
垃圾收集器
Serial收集器(串行收集器)
单线程,效率低,工作期间需要暂停所有工作线程
ParNew收集器(并行收集器)
多线程,效率高,应用程序仍暂停
Parallel Scavenge收集器 1.8
与ParNew类似但吞吐量更高,CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)
G1收集器
如何选择垃圾收集器?
优先调整堆的大小让服务器自己来选择
如果内存小于100m,使用串行收集器
如果是单核,并且没有停顿时间的要求,串行或JVM自己选择
如果允许停顿时间超过1秒,选择并行或者JVM自己选
如果响应时间最重要,并且不能超过1秒,使用并发收集器
垃圾回收机制的概念及补充
不定时在堆内存清理不可达对象
注意:
执行之前执行Obect.finalize方法
内存溢出
\b对象创建需要4G 只支持3G
内存泄露
定义过多的静态变量,垃圾回收不会回收
\b微服务
Spring Cloud
解决什么问题
1.配置管理
2.服务注册和发现
3.熔断
4.路由策略和负载均衡
5.全局锁
6.分布式回话
7.接口网关
8.链路追踪
\b重要组成
Eureka(注册中心)
服务管理
核心
服务注册表,通过心跳机制动态维护
组成
provider服务提供者
启动的时候向注册中心上报自己的网络信息
consumer服务消费者
启动的时候向注册中心上报自己的网络信息,拉取provider的相关网络地址
微服务应用和机器越来越多,调用方需要知道接口的网络地址,如果靠配置文件的方式去控制网络地址,对于动态新增机器,维护带来很大问题
ribbon
一种负载均衡客户端,类似nginx反向代理
Feign
伪EPC客户端,本质还是用http
默认集成ribbon
写起来思路更加清晰方便
采用注解的方式进行配置,配置熔断等方便
Hystrix(熔断器)
熔断
熔断服务,为了防止整个系统故障
降级
抛弃一些非核心的接口和数据
区别和相同点
相同点
从可用性和可靠性触发,为了防止系统崩溃
最终让用户体验到的时某些功能暂时不能用
不同点
熔断一般是下游服务故障导致的,
降级一般是从整体系统负荷考虑,由调用方控制
解决系统负载过高,突发流量或者网络等各种异常问题
Dubbo
配套组成
通信方式
\bhttp+restful
注册中心
zookeper/redis
好处
配置中心
diamond企业中很少用
服务提供者provider
服务消费者consumer
Zookeeper注册中心
数据模型
3.每个节点都能设置相应的权限控制用户的访问
4.每个节点的数据存储不宜过大
6.节点分为临时节点和永久节点
session机制
介绍
session过期
该session创建的所有临时节点都会被抛弃
\bwatcher机制
权限控制
设置权限
set /xdclass auth:xdclass:xdclass:cdrwa
注册用户
addauth digest xdclass:xdclass
三种角色
\bleader:
\bfollwer
observer
\b恢复模式
\b同步模式
\b广播模式
【zookeeper集群选举核心概念】
myid
集群中各服务器的唯一标识
zxid【Long类型】
\b高32位epoch
低32位xid
zk事务id,每一个写操作都会有一个xid
逻辑时钟
zookeeper选举状态
looking
查找leader的状态
leading
领导者状态
following
obsering
\b分布式锁作用及原理
解决问题
\bzookeeper实现分布式锁原理
\b实现方式
缺点;浪费资源
缺点:对程序容易引起羊群效应
zookeeper集群选举发生时机及选举算法
发生时机
1.服务刚开始启动的时候
2.leader宕机之后
选举算法
\b1.服务启动时:
2.服务宕机时
Dobbo超时机制和集群容错机制
1.服务提供方进行配置
单体应用
项目分为逻辑层,数据库层,控制层均在一个项目中
不适合大团队开发
开发速度慢
启动时间长
依赖庞大
微服务
每个服务独立运行,对应一个数据库,轻量级
通讯协议
http协议+restful风格+json
易开发,理解和维护
独立的部署和启动
SOA架构
面向服务架构
服务层
包含业务逻辑,只需要对外提供服务
表现层
只需要处理和页面的交互
\b出现原因:
解决分布式架构的缺点
分布式架构的缺点
系统之间通讯需要使用远程通信,接口开发增加工作量
各个模块有一些通用的业务无法共用
代码复用,解耦
soap
分布式
分布式两种理论
CAP理论
一致性C
所有节点在同一时间的数据完全一致,机器越多,同步数据越耗时
可用性A
负载过大时,服务一直可用,而且是正常响应时间
分区容错性P
挂掉几个节点不影响服务正常运行
BASE理论
核心思想
即使无法做到强一致性,但每个应用都可用根据自身特点,采用适当的方式使系统达到最终一致性
基本可用
分布式系统在出现不可预知故障时,允许损失部分可用性
软状态
允许系统在不同节点间副本同步存在延迟
最终一致性
本质
需要系统保证最终数据的一致性,而不需要实时保证系统数据的强一致性
所有的数据副本,在经过一段时间同步之后,最终都能达到一致的状态
分布式与集群的区别?
\b集群
部署多台相同应用构成集群
减轻单台设备的压力,实现高并发
根据业务需求将项目拆分成各个子系统,各子系统项目协作
做解耦操作
通信调用方式
RPC
远程过程调用,像调用本地服务方法一样调用服务器的服务
支持同步异步调用
客户端与服务器之间建立TCP连接可以一次建立一个,也可以多个调用复用一个连接
数据包小
编解码
序列化
\b连接
丢包
协议
RMI
非 JAVA 语言开发的应用系统的支持不足,不能与非 JAVA 语言书写的对象进行通信
Http
支持多种协议和功能
开发成本低
数据包大
存在网络延迟
分布式事务问题
编码复杂
分布式事务
每个服务器与服务器之间有自己独立的数据源
分布式事务解决框架
\bTCC
GTS(阿里)
LCN框架
\b并发编程
\b应用程序
可执行的软件
进程
执行中得一个程序,程序一旦被载入到内存中并准备执行,就是一个进程。
多线程的集合
注意
在进程中,一定有一个主线程
线程
正在独立运行的一条执行路径
\b多线程
创建方式
实现Runnable接口,重写run方法
使用匿名内部类方式
实现Callable接口,通过FutureTask包装器来创建Thread
优势
提高程序效率,每个线程互不影响,独立运行
线程的生命周期
出生状态
new Thead
就绪状态
调用start方法
执行状态
线程获得CPU时间片以后
阻塞状态
1线程发生IO时
2.试图得到一个锁时
\b死亡状态
run方法执行完
异常终止run方法
休眠状态
sleep()
\b守护线程
跟主线程与gc线程一起销毁
后台下载
用户线程(非守护线程)
用户线程是主线程创建的线程
和主线程互不影响
分批发送短息
迅雷下载的断点续传
\b线程安全
多个线程同时共享一个全局变量,做写的操作的时候会发生线程安全问题
\b解决办法
1.使用synchiroized 1.5之前是重量级锁(以上这些最好都答)
前提
必须有两个线程
必须用同一把锁
保证只有一个线程执行
\b原理
一个线程已经拿到锁,其他线程已经有CPU执行权的,一直排队,等待锁被释放
效率低,扩展性不高,不能自定义
内置锁
\b互斥锁
\b通过悲观锁的形式实现,其他线程只有通过阻塞才能获得锁
\bJVM虚拟机对synchronized的优化
对象实例
\b对象头
Mark Word存储对象的hashCode和锁信息
实例变量
\b填充数据
\b无锁状态
\b是否偏向锁为0锁标志位为01
\b偏向锁
轻量级锁
重量级锁
自旋锁
2.Lock锁
\b深入理解
1.通过乐观锁的形式实现CAS的方式,其他线程获取失败继续重试
死锁
同步中嵌套同步,互不释放
乐观锁和悲观锁
乐观锁
悲观锁
\b公平锁和非公平锁
根据线程获取锁的抢占机制ReentrantLock默认提供非公平锁
公平锁
\b多个线程按照申请锁的顺序来获得锁
\b非公平锁
\b多个线程获取锁的顺序不是按照申请锁的顺序.
\b独占锁和共享锁
\b根据锁能否被多个线程占有
独占锁
\b任何时候都只有一个线程能执行资源操作
\b共享锁
可重入锁
减少线程上下文切换的消耗
\b循环消耗CPU
CAS
JAVA内存模型
\b多线程三大特性
原子性
保证线程安全
\b有序性
\b多线程之间通讯
可用性
Java内存模型
决定了一个线程对另一个线程是否可见
主内存
主要存放共享的全局变量
私有内存
主要存放线程私有变量
Volatile关键字
防止指令重排,刷新主内存
\b优点和局限性
保证线程可见性,但不保证原子性
static关键字
公平锁与非公平锁
遵循排队的规则
非公平锁
只要有机会就尝试去抢占资源
可能导致其他线程抢占不到CPU资源,引起线程饥饿
ReenTranTLock
并发包java.util.concurrnt
原子类
\b并发类
\bLock锁
线程池
\b管理复用线程,提高程序效率
\b1.重复利用
3.管理线程,通过线程池分配和创建线程
线程池原理分析
\b线程池中七个参数解析
2.maximumPoolSize线程池最大线程数量
4.unit空闲线程存活时间单位
5.workQueue工作队列
6.threadFactory线程工厂
1.CallerRunsPolicy
2.AbortPolicy
3.DiscardPolicy
直接丢弃任务什么也不做
CAS和ABA问题
Socket网络编程(完善中)
跨域
其实是浏览器的安全机制,请求访问的域名与ajax请求不一致,浏览器会无法直接返回请求结果
\b跨域问题的解决方案
1.后端配置类添加请求头,允许跨域设置
具体实现方式
response.setHeader(\"access-control-allow-origin\
2.使用JSONP
只支持get请求
3.httpclient转发
4.使用nginx搭建企业api网关
NIO
Netty
BIO
\b客户端通过ip+端口号定位服务端应用程序
网络模型四层结构
应用层
HTTP协议
传输层
TCP协议
网络层
IP协议
链路层
以太网协议
Socket技术遵循一个规则
\b二进制+ip+端口号
Socket两个核心概念
UDP
TCP
Tomcat
\b为什么打破双亲委派机制
重定向原理
转发
内部服务调用
Linux网络编程五种IO模型
IO操作的步骤
1.阻塞IO
客户端读写数据时会发生阻塞
工作流程
2.非阻塞IO
注意点
进程采用轮询的方式反复调用recvfrom函数等待返回成功那个指示
3.IO多路复用
\b工作流程
信号驱动IO
异步IO
\b几个重要知识点
\b1.阻塞和非阻塞是针对线程
2.同步和异步是针对消息的通知机制
3.同步和异步针对用户进程和内核进行交互
\b反射
动态获取当前类的所有信息
1、初始化对象
2.为类的私有属性赋值
提供程序的扩展性,封装一些工具类用于编写框架,如jdbc连接驱动框架,Sring IOC
如何禁止?
\b将构造函数私有化
初始化对象效率低,好资源
事务(完善中)
保证数据一致性
\b事务的特征
\b原子性
一致性
隔离性
多个事务之间互不影响
\b事务的隔离级别
\b脏读
\b幻读
不可重复读
spring事务
Spring事务分类
1.编程式事务
2.声明式事务
多数据源下如何解决
传播行为
Spring(完善中)
Spring
1.解耦
IOC
\b核心
反射机制+解析xml
DI
依赖注入的几种方式
\bset方法注入
xml中p标签注入
\b注解注入
spring作用域
2.多例
AOP
\b相当于在方法执行之前做了一些处理
实现原理
\bjdk静态代理
\b关注点
重复代码
切面
提取重复代码
\b切入点
拦截哪些方法
\bbean生命周期
1.创建bean对象,通过反射实现实例化对象
3.通过BeanNameAware获取查找beanName
4.拿到beanFactory
5.获取上下文
6.执行bean的后置处理器
7.销毁bean
\bSpringmvc
web方向的控制层框架
核心技术
对servlet包装
源码的简单分析
1.springmvc将请求交给disPatcherServlet进行管理
3.通过doDispatcher方法获得请求的信息
4.通过实现HandlerAdapter开始执行拦截器
5.执行完毕后获取当前ModelAndView
6.执行视图解析
高可用(完善中)
Nginx
1.集群(减轻单台服务器压力)
2.采用负载均衡策略进行轮训机制
提高网站吞吐量
3.反向代理(不暴露真实ip地址)
网站安全架构的搭建
1.使用nginx不暴露网站真实ip地址
2.使用https防止抓包分析http请求
4.模拟请求token+验证码
集群和分布式有什么不同
集群
减轻单台服务器压力
完成同一大体功能,RPC远程调用
nginx宕机容错机制实现高可用
高并发高可用解决方案
数据库层面
1.sql语句优化之前定位慢查询
2.通过执行计划任务看sql语句是否全表扫描
3.使用索引
4.分库分表
5.水平分隔取模算法
缓存机制
1.使用redis缓存数据内容
3.使用redis哨兵机制监听
服务器端优化
1.使用nginx反向代理
3.使用动静分离
客户端
1.减少请求
3.动静分离
项目优化
1.代码重构
3.采用微服务分布式架构
任务调度平台
传统任务调度缺点
2.不支持集群
4.无管理平台
5.无法统计哪些有问题
分布式任务调度框架
xxl-job
执行流程
任务
执行器(Job运行服务器)
\bJob调度在调度平台执行
\b分布式调度平台原理
Elastic-job
收藏
收藏
0 条评论
回复 删除
下一页