准备度小满的二面
线程安全实现方式
原子类,比如AtomicInteger。
线程安全的类,比如concurrenthashmap。
加锁,synchronized,reentrentlock。
线程同步方式
同步方法,同步代码块,wait和notify,volatile(告诉虚拟机这个变量可能被其它线程更新,类似count++的操作不能用,不确保原子性。对变量的写入操作不依赖变量的当前值时可以用),锁,threadlocal,原子变量。
volatile变量要加锁吗?
加锁可以确保可见性和原子性,volatile只能确保可见性。
Netty模型
AQS原理
state:
/**
* The synchronization state.
*/
private volatile int state;
/**
* Returns the current value of synchronization state.
* This operation has memory semantics of a {@code volatile} read.
* @return current state value
*/
protected final int getState() {
return state;
}
/**
* Sets the value of synchronization state.
* This operation has memory semantics of a {@code volatile} write.
* @param newState the new state value
*/
protected final void setState(int newState) {
state = newState;
}
/**
* Atomically sets synchronization state to the given updated
* value if the current state value equals the expected value.
* This operation has memory semantics of a {@code volatile} read
* and write.
*
* @param expect the expected value
* @param update the new value
* @return {@code true} if successful. False return indicates that the actual
* value was not equal to the expected value.
*/
protected final boolean compareAndSetState(int expect, int update) {
// See below for intrinsics setup to support this
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
AQS对资源的共享方式
Exclusive
只有一个线程能执行,如ReentrantLock,又可以分为公平锁和非公平锁:
- 公平锁,直接排队,先到先拿锁
- 非公平锁,线程要获取锁时,先通过两次CAS操作去抢锁,没抢到再排队。
Share
多个线程可以同时执行,比如Semaphore,CountDownLatch,CyclicBarrier,ReadWriteLock。
volatile,synchronized,lock区别
简述冯诺依曼模型

控制器,从内存中取指令,翻译指令,分析指令,然后根据指令向有关部件发送控制命令。
运算器,加减乘除,与或非,移位补位等运算。
存储器,内部存储器和外部存储器。
简述OSI七层网络模型
物理层:规定电气,机械方面特性,来建立物理链路连接,进行比特流传输。以太网协议。
数据链路层:将数据分成数据帧,以帧为单位发送,并进行流量控制,传送出错对方要重发。ARP协议。
网络层:为数据包选择路由、分组传输。IP ICMP
传输层:提供端到端的接口。TCP UDP
会话层:进程之间的通信称为会话,会话层管理的是不同主机之间各进程的通信。
表示层:格式化、解压缩和转换服务。
应用层:顶层应用,如文件传出,电子邮件,HTTP FTP DNS
数据链路层的作用
将数据分成数据帧,以帧为单位发送,并进行流量控制,传送出错对方要重发。ARP协议。
二层网络和三层网络有何区别
区别在于是否有路由功能,网络层:为数据包选择路由,分组传输。
二层交换机属于数据链路层设备,可以识别数据包中的MAC地址,根据MAC地址进行转发。
三层交换机是具有部分路由器功能的交换机,可以同时拥有MAC地址表和IP路由表。
hashmap如果想一边遍历,一边删除元素,会有什么问题
会报线程安全问题。
map遍历使用的是迭代器,里面有个modCount变量,会记录map中的元素移除或者添加了几次,expectedModCount是期望的修改次数,在迭代器构造的时候两个值相等,如果不相等了就会抛出异常。
concurrentHashmap可以正常运行。
可以怎么做?不使用同步类有什么办法
通过iterator的方式remove,会同步expectedModCount和modCount。
简述ConcurrentHashmap的原理
如果连接数超过tomcat线程池的上限,有什么处理方式
类似线程池。
如果一个主线程执行到一定时间,想让一定的子线程去执行一些任务,并且超时后就放弃执行,要怎么做
定时任务。同时设置定时任务,如果指定时间未运行结束,interrupt。
Kafka何时会发生再均衡,会有什么影响
如果有新消费者数量变化,分区增加,或者订阅的topic数目发生变化,会触发rebalance。(同一个消费者组中,分区的所有权从一个消费者转移到另一个消费者)。
影响:
- 可能重复性消费(consumer踢出去了,但是还没提交offset)。
- 集群不稳定,会花费一段时间达到稳定状态
- 频繁的rebalance会影响消息的消费速度。
为了规避再均衡产生的影响,可以怎么处理
评估业务需要,增加分区或者topic。
合理设置消费者参数。比如未能及时发送心跳而rebalance,consumer消费超时rebalance。
partition和消费者的关系
一个partition只能被同组的一个consumer消费。如果消费者数量多于partition数量,多于的消费者空闲。多个partition可以对应一个consumer。
单播,多播,广播的应用场景
单播:一个消息只能被一个消费者消费。只要让这些消费者处于同一个消费者组,则这些消费者只有一个能收到消息。
多播:放在不同的消费者组。
广播:所有的consumer有一个独立的组。
Kafka怎么保证有序,什么时候需要保证有序
同一个分区内的消息时有序的。如果要不同分区有序:自定义消息分区路由算法,放到同一个分区。
比如对数据的修改,例如是添加5,然后删除2,但是消费的时候变成了先删除2,这个时候可能有机制不让元素为负,所以可能删除2失败,然后又添加了5。
MySQL如何实现分页,写SQL
真分页,一次只查询需要的。
假分页,一个查询出所有的数据,缓存,再请求就不再访问数据库,而是从缓存拿。
Spring的依赖注入有哪些方式,有什么区别
构造器。不允许bean对象之间的循环依赖。
setter。需要被注入的时候才被注入,而不是初始化的时候注入
field变量。比较简单,可读性高。不能将对象标为final,可能引起空指针。
如何排查OOM问题
对Dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏还是内存溢出。
查代码,历史版本,提交记录。
Mysql日期类型 是啥类型
Https中间者拦截
非对称加密,如RSA算法,素数相乘比较容易,但是因式分解非常困难。
比如一些中间者的自制证书,让用户下载证书并信任,校验的话也会通过。
Redis set helloworld 值是多少字节
int len, int free,char[] 数组
B+树旋转 一个页面多大 ,页分裂过程
MySQL B+树一个页16KB。
在InnoDB索引的设定中,要求主键索引是递增的,这样在构建索引树的时候才更加方便。你可以脑补一下。如果按1、2、3...递增的顺序给你这些数。是不是很方便的构建一棵树。然后你可以自由自在的在这棵树上二分查找。
那假设你自定义了主键索引,而且你自定义的这个主键索引并不一定是自增的。
页分裂的目的就是保证:后面数据页的行主键值比前一个数据页主键值大。
创建新页、判断当前页(页#10)可以从哪里进行分裂(记录行层面)、移动记录行、重新定义页之间的关系。