CMDB&ITMP使用了Dubbo,分布式事务是怎么处理的
每个API都有对称操作的API,单个API实现事务
存储方式是MySQL+ES,ES不支持事务,先对MySQL操作后,再对ES操作,发生异常时可自动对MySQL回滚。
对于多个API调用的事务,采用事务补偿机制,发生异常后,按执行成功API的相反顺序,调用对称的操作回滚数据。
Redis的部署模式
单机部署
主从部署
哨兵部署
集群部署
Mysql锁有哪些类型
按锁粒度,分为:行锁、表锁、元数据锁
行锁按兼容性:共享锁(Shared Lock)、排他锁(Exclusive Lock)
行锁按模式:记录锁、间隙锁(开区间)、临建锁(左开右闭,记录锁+间隙锁)、插入意向锁(一种间隙锁,但多个插入意向锁之间不互斥)
表锁有:意向共享锁(IS Lock)、意向排他锁(IX Lock)
元数据锁:共享锁、排他锁,锁兼容类似行锁,对表数据进行操作时,会加共享锁,对表结构进行修改时,会加排他锁
insert into t1 select * from t2 这条sql会不会加锁
会对t2表直接加上表锁,如果对t2表使用了主键排序,则按照扫描顺序,逐步对记录加锁,否则会直接对全表加锁
t1表走正常插入锁,有自增键时加自增锁(表级),否则插入意向锁。
ConcurrentHashMap怎么实现线程安全的
jdk1.8以后的版本中。
存储一个节点数组,每个节点是一个Hash槽。
Hash槽内是相同Hash值形成的链表或者红黑树,链表元素达到临界点(8个元素)后转为红黑树,元素小于临界点时(6个元素)回归链表。(红黑树节点继承自链表节点实现)
读取时,会对table字段做快照,方式其他线程将table更新为迁移完成的nextTable。
写入或者移除时,都是在循环中处理直至处理无误
对于Hash槽Root节点为空的情况,会新建一个node对象,通过CAS的方式写入数组槽,确保只有一个线程写入成功,不成功的线程会再次循环获取到该Hash槽正确的节点引用
对于Hash槽Root节点不为空的情况,会对命中的Hash槽的Root节点对象使用synchronize加锁。
扩容的时候,会生成一个NextTable数组,用于数据的迁移,一个一个槽位的数据迁移,支持多个线程辅助进行数据迁移,同时原数组的节点会被替换为ForwardingNode,用于在NextTable未替换Table的时候,将Table的数据获取转发到NextTable数组中,确保数据查询无误。
此外,对于Map中元素个数的计数,使用了内存填充的方式,保证CPU缓存之间不存在伪共享问题,提升效率。
BlockingQueue有哪些实现类
ArrayBlockingQueue:基于数组实现的有界阻塞队列,先入先出
LinkedBlockQueue:基于链表的无界阻塞队列,但是最大支持Integer.MAX_VALUE个元素
SynchronousQueue:不缓存任务的阻塞队列,生产者直到消费者取出该任务之前会一直阻塞,线程数到达最大线程数时直接拒绝
PriorityBlockQueue:具有优先级的无界阻塞队列,优先级通过Comparator实现
https://blog.csdn.net/Jiangtagong/article/details/121855261
线程池构造方法有哪些参数
核心线程数(最小线程数):存在该数量的线程,即使线程空闲,也不会销毁线程
线程池最大线程数:任务队列满后,最多创建用于任务处理的线程
空闲线程存活时间+空闲线程存活时间单位
工作队列,提交的线程任务,队列实现有:ArrayBlockingQueue、LinkedBlockQueue、SynchronousQueue、PriorityBlockQueue
线程工厂:创建新线程的工厂
拒绝策略:任务队列放不下时的处理策略
在调用线程直接执行任务的run方法,线程池shutdown时直接抛弃任务
直接丢弃任务,抛出RejectedExecutionException
直接丢弃任务,无后续操作
丢弃任务队列最早的任务,再次尝试插入当前任务
public static synchronized method1(){}和public synchronized method2(){}中synchronized区别
静态方法中使用时,锁定的是这个方法所属类的类对象XXX.class
实例方法中使用时,锁定的是当前的对象实例new XXX()
内存不足有哪些错误
堆:OutOfMemoryError
栈:StackOverflowError
怎么查看运行中jvm的线程状态
jps
jstack <pid>
怎么查看运行中jvm的GC情况
jps
jstat -gc <pid>
S0C:第一个幸存区的大小,单位KB
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间,单位s
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间,单位s
GCT:垃圾回收消耗总时间
怎么查看运行中jvm的对象信息
jps
jmap -histo <pid>
怎么查看运行中Redis的状态
redis-cli
info
Http响应码302和304的区别
302代表重定向,将引导客户端跳转到Location响应头标识的URL中
304代表缓存有效,请求携带有效的If Modified Since请求投时,根据该时间与资源实际修改时间对比,若资源未发生变化,响应码返回304,告知客户端使用缓存即可;若返回200,则同步在响应体中返回资源数据,客户端将根据响应头,决定是否缓存当前响应信息。