java面试整理
2024-09-25 10:59:09 4 举报
AI智能生成
java知识点梳理,面试整理
作者其他创作
大纲/内容
Nginx
安装教程
一、官网下载安装包
二、解压:tar -zxvf nginx-xxx.tar.gz
三、安装依赖包:yum install pcre-devel (zlib-devel)
四、生成Makefile文件
命令:./configure
./configure --help参考参数列表
指定安装目录:./configure --prefix=安装目录(建议使用绝对路径)
默认安装目录:/usr/local/nginx
五、编译、安装(make && make install)
启动命令
查看参数列表:./nginx -h
-v:显示版本并退出
-V:显示版本和配置选项,然后退出
-t:测试配置和退出
-s:stop/quit/reopen/reload(停止、退出、重新打开、重新加载)
-p:set prefix path (default: /home/nginx-1.20.1/nginx/)
-e:设置错误日志文件(default: logs/error.log)
-c:设置配置文件(default: conf/nginx.conf)
配置文件
全局模块
error_log
语法:error_log file [ debug | info | notice | warn | error | crit ]
缺省值: ${prefix}/logs/error.log
描述:全局错误日志存放位置
include
语法: include file | *
缺省值: none
描述:你可以在任意地方使用include指令实现配置文件的包含
user
语法: user user [group]
缺省值: nobody nobody
描述:指定Nginx Worker进程运行用户,默认是nobody帐号。
worker_processes
语法: worker_processes number
缺省值: 1
描述:nginx工作进程数量
事件模块
HTTP模块
internal
语法: internal
默认值:no
作用域:location
描述:internal 表示匹配位置只能用于所谓的“内部”请求。
location
语法: location [=|~|~*|^~] /uri/ { ... }
作用域:server
优先级
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通用匹配
当有匹配成功时候,停止匹配,按当前匹配规则处理请求
alias
语法: alias file-path|directory-path
作用域:location
集合
List
ArrayList
数据结构:数组实现
初始为空数组,当添加第一个元素时扩容数组大小为10,
扩容原来的1.5倍
主要变量有elementData:Object[],size:int
特点:线程不安全
Vector
数据结构:数组实现
内部方法与ArrayList一样
主要变量有elementData:Object[],size:int,capacityIncrement:int
当指定了容量增量capacityIncrement,按增量扩容;否则扩容原来的2倍
特点:线程安全
LinkedList
数据结构:双向链表
实现了List、Deque接口
主要变量有first:Node<E>,last:Node<E>,size:int
get方法:首先校验index参数,然后二分法判断index区间,在前使用first往后遍历节点,在后使用last往前遍历节点
特点:线程不安全
Set
HashSet
LinkedHashSet
Queue
LinkedList
特点:双向链表、线程不安全
ArrayDeque
特点:数组、线程不安全
ConcurrentLinkedDeque
特点:双向链表、线程安全
Map
HashMap
数据结构:数组+链表(链表散列)
ConcurrentMap
LinkedHashMap
Hashtable
多线程、锁
进程
线程
基本概念
线程是一个程序里面不同的执行路径
线程状态
新建(NEW)
可运行(RUNNABLE)
运行(RUNNING)
阻塞(BLOCKED)
等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
死亡(DEAD)
创建线程的3种方式
继承Thread类
实现Runnable接口(建议)
实现Callable接口
sleep()
join()
yield()
wait()
notify()/notifyAll()
volatile
保证线程可见性
禁止指令重排序
CAS
实现方式:CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。当多个线程同时尝试使用CAS更新一个变量时,任何时候只有一个线程可以更新成功,若更新失败,线程会重新进入循环再次进行尝试。
CAS在Java中的应用:在java.util.concurrent.atomic包下,比如AtomicInteger、AtomicLong、AtomicReference类等
CAS带来的问题
ABA问题
循环开销过大
只能保证一个变量的原子操作
LongAdder:分段锁,高并发下性能更快(内部实现还是cas)
java.util.concurrent包
CountDownLatch
CyclicBarrier
ReadWriteLock接口
同步锁
synchronized
可重入锁:一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,再次申请的时候仍然会得到该对象的锁.
出现异常,默认锁会被释放
同步方法和非同步方法可以同时调用
对写方法加锁,读方法不加锁,容易产生脏读问题
不要以字符串常量作为锁定对象
应该避免将锁定对象的引用变成另外的对象,在锁对象前面加上final修饰,或者锁定当前对象
ReentrantLock
lock()
优先考虑获取锁,待获取锁成功后,才响应中断。
lockInterruptibly()
优先考虑响应中断,而不是响应锁的普通获取或重入获取。(中断响应)
tryLock()
尝试加锁,返回true/false;不管最终是否获取到锁,都会向下执行
公平锁和非公平锁切换(通过构造方法设置)
死锁
互斥:指多个线程不能同时使用同一个资源。
占有且等待:当线程 A 已经持有了资源 1,又想申请资源 2,而资源 2 已经被线程 B 持有了,所以线程 A 就会处于等待状态,但是线程 A 在等待资源 2 的同时并不会释放自己已经持有的资源 1。
不可抢占:当线程A已经持有了资源 ,在自己使用完之前不能被其他线程获取,线程 B 如果也想使用此资源,则只能在线程 A 使用完并释放后才能获取。
循环等待:在死锁发生的时候,两个线程获取资源的顺序构成了环形链。
协程/纤程
设计模式
网络
HTTPS 是怎么加密的
普通 Hash 和一致性 Hash 原理
一致性 Hash 的缺点
TCP 三次握手过程,为什么需要三次握手
为什么 TIME_WAIT 状态需要经过 2MSL 才能返回到 CLOSE 状态
TCP 的拥塞控制
TCP 如何解决流控、乱序、丢包问题
为什么会出现粘包和拆包,如何解决
框架
spring
优点
1、方便解耦,简化开发
2、aop编程的支持
3、声明式事务的支持
4、方便程序的测试
5、方便集成各种优秀框架
IOC:Inversion Of Controller
依赖注入(DI)
构造器注入
set注入
依赖查找(DL)
容器
BeanFactory
延迟加载
ApplicationContext
提前实例化所有bean对象
支持的功能
1、依赖注入
2、依赖检查
3、自动装配
@Autowired注解是byType类型的
@Qualifier注解使用byName进行装配
4、支持集合
5、指定初始化方法和销毁方法
6、支持回调某些方法
AOP:Aspect Oriented Programming
创建对象的5种方式
new关键字:通过调用构造器(无参或有参)
Class.newInstace
Constructor.newInstance
Clone
反序列化
关于两种newInstance方法的区别?
1、Class类的newInstance只能触发无参数的构造方法创建对象,而构造器类的newInstance能触发有参数或者任意参数的构造方法来创建对象。
2、Class类的newInstance需要其构造方法是public的或者对调用方法可见的,而构造器类的newInstance可以在特定环境下调用私有构造方法来创建对象。
spring boot
mybatis
shiro
数据库
MySQL
redis
es
jvm
中间件
Kafka
Rocketmq
canal
Zookeeper
Zookeeper 的使用场景
Zookeeper 怎么实现分布式锁
Zookeeper 怎么保证数据的一致性
ZAB 协议的原理
Zookeeper 遵循 CAP 中的哪些
Zookeeper 和 Eureka 的区别
Zookeeper 的 Leader 选举
Observer 的作用
Leader 发送了 commit 消息,但是所有的 follower 都没有收到这条消息,Leader 就挂了,后续会怎么处理
分布式
CAP 理论
Consistency(一致性)
Availability(可用性)
Partition tolerance(分区容错性)
BASE 理论
分布式事务 2PC 和 TCC 的原理
TCC 在 cancel 阶段如果出现失败怎么处理
Paxos 算法、Raft 算法
0 条评论
下一页