准备度小满的二面


线程安全实现方式

原子类,比如AtomicInteger。

线程安全的类,比如concurrenthashmap。

加锁,synchronized,reentrentlock。

线程同步方式

同步方法,同步代码块,wait和notify,volatile(告诉虚拟机这个变量可能被其它线程更新,类似count++的操作不能用,不确保原子性。对变量的写入操作不依赖变量的当前值时可以用),锁,threadlocal,原子变量。

volatile变量要加锁吗?

加锁可以确保可见性和原子性,volatile只能确保可见性。

Netty模型

链接

AQS原理

image-20220906204347769

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区别

简述冯诺依曼模型

image-20220906205842242

控制器,从内存中取指令,翻译指令,分析指令,然后根据指令向有关部件发送控制命令。

运算器,加减乘除,与或非,移位补位等运算。

存储器,内部存储器和外部存储器。

简述OSI七层网络模型

物理层:规定电气,机械方面特性,来建立物理链路连接,进行比特流传输。以太网协议。

数据链路层:将数据分成数据帧,以帧为单位发送,并进行流量控制,传送出错对方要重发。ARP协议。

网络层:为数据包选择路由、分组传输。IP ICMP

传输层:提供端到端的接口。TCP UDP

会话层:进程之间的通信称为会话,会话层管理的是不同主机之间各进程的通信。

表示层:格式化、解压缩和转换服务。

应用层:顶层应用,如文件传出,电子邮件,HTTP FTP DNS

数据链路层的作用

将数据分成数据帧,以帧为单位发送,并进行流量控制,传送出错对方要重发。ARP协议。

二层网络和三层网络有何区别

区别在于是否有路由功能,网络层:为数据包选择路由,分组传输。

二层交换机属于数据链路层设备,可以识别数据包中的MAC地址,根据MAC地址进行转发。

三层交换机是具有部分路由器功能的交换机,可以同时拥有MAC地址表和IP路由表。

hashmap如果想一边遍历,一边删除元素,会有什么问题

会报线程安全问题。

image-20220906212932225

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日期类型 是啥类型

image-20220906221449551

Https中间者拦截

非对称加密,如RSA算法,素数相乘比较容易,但是因式分解非常困难。

比如一些中间者的自制证书,让用户下载证书并信任,校验的话也会通过。

Redis set helloworld 值是多少字节

int len, int free,char[] 数组

B+树旋转 一个页面多大 ,页分裂过程

MySQL B+树一个页16KB。

在InnoDB索引的设定中,要求主键索引是递增的,这样在构建索引树的时候才更加方便。你可以脑补一下。如果按1、2、3...递增的顺序给你这些数。是不是很方便的构建一棵树。然后你可以自由自在的在这棵树上二分查找。

那假设你自定义了主键索引,而且你自定义的这个主键索引并不一定是自增的。

页分裂的目的就是保证:后面数据页的行主键值比前一个数据页主键值大。

创建新页、判断当前页(页#10)可以从哪里进行分裂(记录行层面)、移动记录行、重新定义页之间的关系。