java面试整理
2024-09-25 10:59:09 6 举报
AI智能生成
java知识点梳理,面试整理
作者其他创作
大纲/内容
Nginx
安装教程
一、官网下载安装包
二、解压:tar -zxvf nginx-xxx.tar.gz
三、安装依赖包:yum install pcre-devel <font color="#388e3c">(zlib-devel)</font><br>
四、生成Makefile文件<br>
命令:./configure<br>
./configure --help参考参数列表
指定安装目录:./configure --prefix=安装目录<font color="#f44336">(建议使用绝对路径)</font>
默认安装目录:/usr/local/nginx<br>
五、编译、安装(make && make install)
启动命令
查看参数列表:./nginx -h
-v:显示版本并退出<br>
-V:显示版本和配置选项,然后退出
-t:测试配置和退出
-s:stop/quit/reopen/reload(停止、退出、重新打开、重新加载)<br>
-p:set prefix path (default: /home/nginx-1.20.1/nginx/)
-e:设置错误日志文件(default: logs/error.log)
-c:设置配置文件(default: conf/nginx.conf)
配置文件
全局模块
error_log
<b>语法:</b>error_log file [ debug | info | notice | warn | error | crit ]<br>
<b>缺省值:</b> ${prefix}/logs/error.log
<b>描述:</b>全局错误日志存放位置
include
<b>语法: </b>include file | *
<b>缺省值: </b>none
<b>描述:</b>你可以在任意地方使用include指令实现配置文件的包含
user
<b>语法: </b>user user [group]
<b>缺省值: </b>nobody nobody
<b>描述:</b>指定Nginx Worker进程运行用户,默认是nobody帐号。
worker_processes
<b>语法:</b> worker_processes number
<b>缺省值: </b>1<br>
<b>描述:</b>nginx工作进程数量
事件模块
HTTP模块
internal
<b>语法:</b> internal<br>
<b>默认值:</b>no
<b>作用域:</b>location
<b>描述:</b>internal 表示匹配位置只能用于所谓的“内部”请求。
location
<b>语法: </b>location [=|~|~*|^~] /uri/ { ... }
<b>作用域:</b>server
优先级
首先精确匹配 =<br>
其次前缀匹配 ^~<br>
其次是按文件中顺序的正则匹配
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通用匹配
当有匹配成功时候,停止匹配,按当前匹配规则处理请求
alias<br>
<b>语法:</b> alias file-path|directory-path<br>
<b>作用域:</b>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()<br>
yield()
wait()
notify()/notifyAll()
volatile
保证线程可见性
禁止指令重排序
CAS
<b>实现方式:</b>CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。当多个线程同时尝试使用CAS更新一个变量时,任何时候只有一个线程可以更新成功,若更新失败,线程会重新进入循环再次进行尝试。<br>
<b>CAS在Java中的应用</b>:在java.util.concurrent.atomic包下,比如AtomicInteger、AtomicLong、AtomicReference类等<br>
CAS带来的问题
ABA问题<br>
循环开销过大<br>
只能保证一个变量的原子操作
LongAdder:<b>分段锁,高并发下性能更快(内部实现还是cas)</b><br>
java.util.concurrent包<br>
CountDownLatch<br>
CyclicBarrier<br>
ReadWriteLock接口
同步锁
synchronized<br>
可重入锁:一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,再次申请的时候仍然会得到该对象的锁.
出现异常,默认锁会被释放
同步方法和非同步方法可以同时调用
对写方法加锁,读方法不加锁,容易产生脏读问题
不要以字符串常量作为锁定对象
应该避免将锁定对象的引用变成另外的对象,在锁对象前面加上final修饰,或者锁定当前对象
ReentrantLock<br>
lock()
优先考虑获取锁,待获取锁成功后,才响应中断。
lockInterruptibly()
优先考虑响应中断,而不是响应锁的普通获取或重入获取。(中断响应)
tryLock()
尝试加锁,返回true/false;不管最终是否获取到锁,都会向下执行
公平锁和非公平锁切换(通过构造方法设置)<br>
死锁
<b>互斥:</b>指多个线程不能同时使用同一个资源。<br>
<b>占有且等待:</b>当线程 A 已经持有了资源 1,又想申请资源 2,而资源 2 已经被线程 B 持有了,所以线程 A 就会处于等待状态,但是线程 A 在等待资源 2 的同时并不会释放自己已经持有的资源 1。
<b>不可抢占:</b>当线程A已经持有了资源 ,在自己使用完之前不能被其他线程获取,线程 B 如果也想使用此资源,则只能在线程 A 使用完并释放后才能获取。
<b>循环等待:</b>在死锁发生的时候,两个线程获取资源的顺序构成了环形链。
协程/纤程
设计模式
网络
HTTPS 是怎么加密的
普通 Hash 和一致性 Hash 原理
一致性 Hash 的缺点
TCP 三次握手过程,为什么需要三次握手
为什么 TIME_WAIT 状态需要经过 2MSL 才能返回到 CLOSE 状态
TCP 的拥塞控制
TCP 如何解决流控、乱序、丢包问题
为什么会出现粘包和拆包,如何解决
框架
spring
优点
1、方便解耦,简化开发<br>
2、aop编程的支持<br>
3、声明式事务的支持
4、方便程序的测试
5、方便集成各种优秀框架
IOC:Inversion Of Controller<br>
依赖注入(DI)
构造器注入
set注入
依赖查找(DL)<br>
容器
BeanFactory
延迟加载
ApplicationContext<br>
提前实例化所有bean对象
支持的功能
1、依赖注入<br>
2、依赖检查
3、自动装配<br>
@Autowired注解是byType类型的
@Qualifier注解使用byName进行装配
4、支持集合
5、指定初始化方法和销毁方法<br>
6、支持回调某些方法<br>
AOP:Aspect Oriented Programming
创建对象的5种方式
new关键字:通过调用构造器(无参或有参)
Class.newInstace
Constructor.newInstance<br>
Clone
反序列化
关于两种newInstance方法的区别?<br>
1、Class类的newInstance只能触发无参数的构造方法创建对象,而构造器类的newInstance能触发有参数或者任意参数的构造方法来创建对象。<br>
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(一致性)<br>
Availability(可用性)
Partition tolerance(分区容错性)
BASE 理论
分布式事务 2PC 和 TCC 的原理
TCC 在 cancel 阶段如果出现失败怎么处理
Paxos 算法、Raft 算法
0 条评论
下一页
为你推荐
查看更多