其他 mp.weixin.qq.com/s/fIUFg1lue…
并发编程的艺术
- synchronized原理,怎么保证可重入性,可见性,抛异常怎么办,和lock锁的区别,2个线程同时访问synchronized的静态方法,2个线程同时访问一个synchronized静态方法和非静态方法,分别怎么进行
- synchronized基于jvm实现,当线程阻塞,会自动释放锁;
- 可重入性指的是同一个线程重复请求由自己持有的锁对象时,可以请求成功而不会发生死锁;实现原理是利用计算机系统的mutex Lock实现。每一个可重入锁都会关联一个线程ID和一个锁状态status。当一个线程请求方法时,会去检查锁状态,如果锁状态是0,代表该锁没有被占用,直接进行CAS操作获取锁,将线程ID替换成自己的线程ID。如果锁状态不是0,代表有线程在访问该方法。此时,如果线程ID是自己的线程ID,如果是可重入锁,会将status自增1,然后获取到该锁,进而执行相应的方法。如果是非重入锁,就会进入阻塞队列等待。释放锁时,可重入锁,每一次退出方法,就会将status减1,直至status的值为0,最后释放该锁。释放锁时,非可重入锁,线程退出方法,直接就会释放该锁。
线程池的参数
7个参数:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。
corePoolSize:核心线程数
线程池维护的最小线程数量,核心线程创建后不会被回收(注意:设置allowCoreThreadTimeout=true后,空闲的核心线程超过存活时间也会被回收)。
大于核心线程数的线程,在空闲时间超过keepAliveTime后会被回收。
线程池刚创建时,里面没有一个线程,当调用 execute() 方法添加一个任务时,如果正在运行的线程数量小于corePoolSize,则马上创建新线程并运行这个任务。
maximumPoolSize:最大线程数
线程池允许创建的最大线程数量。
当添加一个任务时,核心线程数已满,线程池还没达到最大线程数,并且没有空闲线程,工作队列已满的情况下,创建一个新线程,然后从工作队列的头部取出一个任务交由新线程来处理,而将刚提交的任务放入工作队列尾部。
keepAliveTime:空闲线程存活时间
当一个可被回收的线程的空闲时间大于keepAliveTime,就会被回收。
可被回收的线程:
设置allowCoreThreadTimeout=true的核心线程。大于核心线程数的线程(非核心线程)。
unit:时间单位
workQueue:工作队列
新任务被提交后,会先添加到工作队列,任务调度时再从队列中取出任务。工作队列实现了BlockingQueue接口。
JDK默认的工作队列有五种:
1.ArrayBlockingQueue 数组型阻塞队列:数组结构,初始化时传入大小,有界,FIFO,使用一个重入锁,默认使用非公平锁,入队和出队共用一个锁,互斥。
2.LinkedBlockingQueue 链表型阻塞队列:链表结构,默认初始化大小为Integer.MAX_VALUE,有界(近似无解),FIFO,使用两个重入锁分别控制元素的入队和出队,用Condition进行线程间的唤醒和等待。
3.SynchronousQueue 同步队列:容量为0,添加任务必须等待取出任务,这个队列相当于通道,不存储元素。
4.PriorityBlockingQueue 优先阻塞队列:无界,默认采用元素自然顺序升序排列。
5.DelayQueue 延时队列:无界,元素有过期时间,过期的元素才能被取出。
threadFactory:线程工厂
创建线程的工厂,可以设定线程名、线程编号等。
handler:拒绝策略
当线程池线程数已满,并且工作队列达到限制,新提交的任务使用拒绝策略处理。可以自定义拒绝策略,拒绝策略需要实现RejectedExecutionHandler接口。
JDK默认的拒绝策略有四种:
1.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
2.DiscardPolicy:丢弃任务,但是不抛出异常。可能导致无法发现系统的异常状态。
3.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
4.CallerRunsPolicy:由调用线程处理该任务。
-
lock基于代码实现,需要再finally主动释放锁.

问: 自旋锁,线程上下文切换的开销具体是什么,中断,有哪些中断,用户态和内核态切换过程?
2.volatile作用,原理,怎么保证可见性的,内存屏障
- 当一个线程修改共享变量时,能够让其他线程读取最新的值;处理器缓存强制写到内存中
3.你了解那些锁,乐观锁和悲观锁,为什么读要加锁,乐观锁为什么适合读场景,写场景不行么,会有什么问题,cas原理
4.什么情况下产生死锁,怎么排查,怎么解决 两个线程都在等待对方释放锁获取资源
- 1.尽量避免同一个线程获取多个锁
- 2.避免一个锁内占用多个资源
- 3.使用定时锁代替内部锁机制
- 4.数据库锁 加锁和解锁必须在一个线程连接中
5.同步IO和异步IO,直接 I/O 和缓冲 I/O 区别
-
同步I/O操作:实际的I/O操作将导致请求进程阻塞,直到I/O操作完成。
-
异步I/O操作:实际的I/O操作不导致请求进程阻塞。 同步IO指必须完成此项IO操作获取IO到应用进程的缓冲区 返回才能进行下一项操作 ref
-
缓存IO:数据从磁盘先通过DMA copy到内核空间,再从内核空间通过cpu copy到用户空间
-
直接IO:数据从磁盘通过DMA copy到用户空间 ref
6.堆里面如何控制并发安全
- 原子性:互斥访问,同一个时刻只能有一个线程来对它进行操作, 如Atomic包,锁
- 可见性:一个线程对主内存的修改可以及时的被其他线程观察的到
- 有序性:一个线程观察其他线程中指令执行顺序,由于指令重排序存在,观察结果一般杂乱无序
7.进程和线程的区别,创建线程和进程的开销指什么,协程 ref
8.操作系统当中的进程调度算法。每种算法的优缺点。 ref
操作系统
1.虚拟内存,虚拟地址和物理地址怎么转换,内存分段,内存分页,优缺点 根据局部性原理(时间空间), 计算页号-页内偏移量
分布式
1.一致性hash原理,解决什么问题,数据倾斜,为什么是2的32次方,20次方可以么
6.eureka原理,强一致性呢,为什么,怎么保证强一致性,多级缓存怎么保证一致性,eureka集群,宕机了服务还能调用么
- 答:Eureka 的设计原则是 AP,即可用性和分区容错性。他保证了注册中心的可用性,但舍弃了数据一致性,各节点上的数据有可能是不一致的(会最终一致)。同时 内置了timeTask将二级缓存同步到一级缓存 ref
7.hystrix原理,半开状态知道么,具体的一个转换过程,它的隔离是怎么实现的
- 当熔断器开关处于打开状态, 经过一段时间后, 熔断器会自动进入半开状态, 这时熔断器只允许一个请求通过. 当该请求调用成功时, 熔断器恢复到关闭状态. 若该请求失败, 熔断器继续保持打开状态, 接下来的请求被禁止通过.
- ref
8.zookeeper一致性保证,zab协议原理,半数原则如果查询到另外一半呢,那zookeeper属于哪种一致性,强一致性么,还是最终一致性
- ZK 的设计原则是 CP,即强一致性和分区容错性。他保证数据的强一致性,但舍弃了可用性,如果出现网络问题可能会影响 ZK 的选举,导致 ZK 注册中心的不可用。
9.zookeeper选举机制,选举过程有什么问题
- 剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s, 且选举期间整个zk集群都是不可用的,因此选用Eureka 选举算法

redis
6.redis缓存穿透,布隆过滤器,怎么使用,有什么问题,怎么解决这个问题
7.redis分布式锁,过期时间怎么定的,如果一个业务执行时间比较长,锁过期了怎么办,怎么保证释放锁的一个原子性,你们redis是集群的么,讲讲redlock算法
7.redis管道用过么,用来做什么,它的原理是,保证原子性么,和事务的区别,redis事务保证原子性么
8.redis强一致性么,怎么保证强一致性,有什么方案
9.Redis与MySQL双写一致性如何保证 参考
mysql
8.mysql事务,acid,实现原理,脏读,脏写,隔离级别,实现原理,mvcc,幻读,间隙锁原理,什么情况下会使用间隙锁,锁失效怎么办,其他锁了解么,行锁,表锁
9.mysql索引左前缀原理,怎么优化,哪些字段适合建索引,索引有什么优缺点
10.线上遇到过慢查询么,怎么定位,优化的,explain,using filesort表示什么意思,产生原因,怎么解决
11.怎么理解幂等性,有遇到过实际场景么,怎么解决的,为什么用redis,redis过期了或者数据没了怎么办
HTTP
1.http请求头,expire,cache-control字段,状态码,301,302,401,403 cache-control:是设置静态资源缓存,只有服务端可以开启缓存,max-age 30s no-cache expire GMT时间: 是HTTP控制缓存的基本手段,这个属性告诉缓存器:相关副本在多长时间内是新鲜的。 过了这个时间,缓存器就会向源服务器发送请求,检查文档是否被修改。
3** 重定向,需要进一步的操作以完成请求 301 永久移动 302暂时移动 401 要求用户的身份认证 403:无权限执行 状态码
2.如何保证幂等性 http如何实现幂等:比如post请求,第一对应的后端Service 通过分布式锁bizNo做到幂等性,第二服务器端收到 POST 请求,在操作成功后必须302跳转到另外一个页面,防止刷新重复提交. 或者申请token进行校验,用过即弃 tygasoft.com/http-idempo…
3.tcp连接client和server有哪些状态,time_wait状态
4.http与https的区别,并具体说明https的原理,
https原理,数字签名,数字证书,非对称加密算法过程,有什么问题
超文本传输协议http以明文在客户端与服务器之间传递信息,不安全
https是基于http,通过ssl/tls协议进行文本加密传输;通过CA证书身份认证的协议.相比于http,网站加解密开销增大,使用端口不同,安全性提高.
https使用CA证书避免中间人伪造私钥,通过数字证书和数字签名.
server拥有公钥,将公钥发给CA认证机构获取数字证书,server将数字证书以及公钥发给client
传输数据采用对称加密,建立连接采用非对称加密
TLS 的密码套件命名格式为 密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法:ECDHE-RSA-AES256-GCM-SHA384
HTTPS涉及的计算环节
- 1、非对称密钥交换。比如RSA, Diffie-Hellman, ECDHE.这类算法的主要作用就是根据客户端和服务端不对称的信息,经过高强度的密钥生成算法,生成对称密钥,用于加解密后续应用消息。
- 2、对称加解密。服务端使用密钥A对响应内容进行加密,客户端使用相同的密钥A对加密内容进行解密,反之亦然。
- 3、消息一致性验证。每一段加密的内容都会附加一个MAC消息,即消息认证码。简单地说就是对内容进行的安全哈希计算,接收方需要校验MAC码。
- 4、证书签名校验。这个阶段主要发生在客户端校验服务端证书身份时,需要对证书签名进行校验,确保证书的真实性。
5.session与cookie,以及项目中怎么用的? session存储在server里,cookie存储在client中,都用于记录用户信息 当用户登录后,cookie存储用户当前的sessionId,当该client请求server时,根据sessionid获取当前用户信息(目前一般存储信息包括token,ts,mac地址等) cookie包括key,value,domain,path,expire
- 输入一个网址到浏览器渲染出页面的过程中有哪些报文,分别涉及哪些协议,协议的主要内容是啥,分别用来做什么的?
- 在客户端浏览器中输入网址URL。
- 发送到DNS(域名服务器)获得域名对应的WEB服务器的IP地址。
- 客户端浏览器与WEB服务器建立TCP(传输控制协议)连接。
- 客户端浏览器向对应IP地址的WEB服务器发送相应的HTTP或HTTPS请求。5) WEB服务器响应请求,返回指定的URL数据或错误信息;如果设定重定向,则重定向到新的URL地址。
- 客户端浏览器下载数据,解析HTML源文件,解析的过程中实现对页面的排版,解析完成后,在浏览器中显示基础的页面。
- 分析页面中的超链接,显示在当前页面,重复以上过程直至没有超链接需要发送,完成页面的全部显示。 参考
7.TCP 3次握手 4次挥手 拥塞控制会出现哪些问题,如果过程中服务器宕机会出现什么问题,怎么去解决? c发送SYN=1请求连接 s收到后发送syn+=1和ACK指令 c发送s ack指令建立连接 如果服务器宕机说明只是3次挥手,比如客户端发送FIN指令未收到ACK,则处于等待关闭状态,造成资源浪费
8.linux最多可以建立多少个tcp连接,client端,server端,超过了怎么办 理论上 client(unsigned short)65535-1024个; server 上2^48个(客户端ip数×客户端port数) 实际上在unix/linux下限制连接数的主要因素是内存和允许的文件描述符个数(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符),另外1024以下的端口通常为保留端口 对server端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万,甚至上百万是没问题的 ref
算法:最长不重复的连续子串 1.函数a调用函数b的过程,是怎么传参的 2.java里面的函数调用有哪些,io流里面有函数调用么 3.fork函数,父子进程的区别,孤儿进程,僵尸进程会有什么问题,进程有哪些状态,进程间怎么同步,通信,消息队列,管道怎么实现的,进程调度算法,各有什么优缺点 4.dos攻击,ddos攻击,drdos攻击,怎么解决,syn flood
6.一张大表怎么更改表的数据结构,字段,用alter会有什么问题,怎么解决呢,有什么好的方案,双写的话会有什么问题,还有其他方案么
9.kafka怎么保证消息不丢失的 算法:找出所有相加之和为 n 的 k 个数的组合,组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字,输入: k = 3, x = 9 输出: [[1,2,6], [1,3,5], [2,3,4]] 2.反射了解么,原理是什么 3.treemap和linkdedhashmap区别,实现原理 4.jvm类加载的过程讲讲,符号引用是什么,哪些情况会发生初始化 5.spring的循环依赖,怎么解决的,为什么需要加个三级缓存,二级不行么 6.springboot有什么特点,相比与spring,了解springboot的自动装配的一个原理么 7.kafka支持事务么,你们项目中有使用么,它的原理是什么 8.怎么统计一亿用户的日活,hyperloglog有什么缺点,bitmap不行么