java 面试题总结

本文探讨了Java中不同类型的锁机制,如无锁、偏向锁等,以及ConcurrentHashMap在JDK1.7和1.8中的锁策略变化。还介绍了SpringCloud中的熔断降级概念,以及Eureka服务注册中心的健康检查机制。此外,文中还涉及Dockerfile示例和线程池的管理,以及MVCC多版本并发控制原理的应用。
摘要由CSDN通过智能技术生成

1锁粗化和锁消除,锁膨胀和锁升级的区别。

https://www.cnblogs.com/xuxinstyle/p/13387778.html

.无锁 < 偏向锁 < 轻量级锁 < 重量级锁 ,说的时候不要忘记说无锁状态

2.Map 的实现,线程安全的实现

1、ConcurrentHashMap在JDK 1.7中使用的数组 加 链表的结构,其中数组分为两类,大树组Segment 和 小数组 HashEntry,而加锁是通过给Segment添加ReentrantLock重入锁来保证线程安全的。

2、ConcurrentHashMap在JDK1.8中使用的是数组 加 链表 加 红黑树的方式实现,它是通过 CAS 或者 synchronized  来保证线程安全的,并且缩小了锁的粒度,查询性能也更高。

3. springcloud 熔断降级,什么是熔断降级,你们是怎样处理的。

服务熔断一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施。

服务降级是在服务器压力陡增的情况下,利用有限资源,根据当前业务情况,关闭某些服务接口或者页面,以此释放服务器资源以保证核心任务的正常运行。

这个问题日常工作中一般有个监控软件,监控服务状态比如cpu,内存,服务的健康性,服务异常会发报警, 然后开发人员处理,但是具体这个属于熔断还是降级,这个貌似啥也不属于。

4.eureka的健康检查

注册中心的心跳机制有两种形式:客户端主动上报和客户端被动响应。

Eureka属于是主动上报类型的,Client通过renew机制频繁的向Server发送消息,通知Server它还活着,不要将其从服务列表中剔除,但是我们renew仅仅是监控Client是否存活,并不会去检测Client依赖的服务是否存活

renew最基础的就是调一下Server的/apps/{appName}/{instanceId}?status=&lastDirtyTimestamp=接口,正常情况下Client启动后的status为UP,所以只要Client自身服务不出问题,永远都是UP,默认的指示器是CompositeHealthIndicator,默认的管理器为EurekaHealthCheckHandler;

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

eureka.clientt.healthcheck.enabled = true

eureka.instance.lease-renewal-interval-in-seconds=15 默认是30s

自定义监控指标参考 Eureka心跳检测-CSDN博客

# Dockerfile 示例
FROM openjdk:17-jdk-slim
# 假设你的Spring Boot应用编译打包后的jar名为app.jar
COPY target/app.jar /app.jar
# 设置环境变量以启用Spring Boot Actuator的健康检查端点
ENV SPRING_BOOT_ADMIN_CLIENT_HEALTH-CHECK-URL=http://localhost:8080/actuator/health
# 定义健康检查命令,每30秒执行一次,连续两次失败判定为不健康
HEALTHCHECK --interval=30s --timeout=5s --start-period=1m --retries=2 CMD curl -f http://localhost:8080/actuator/health || exit 1
# 指定容器启动时运行的应用
ENTRYPOINT ['java', '-jar', '/app.jar']

1.AQS 为啥唤醒从后到前唤醒线程

2.线程池的核心参数:核心线程数,最大线程数,等待时间,等待时间单位,阻塞队列,线程工厂,拒绝策略

3. 线程池的拒绝策略

AbortPolicy 直接报错

DiscardPolicy 直接丢掉

CallerRunsPolicy 直接让调用线程执行

DiscardOlderst 丢弃距离当前时间阻塞队列里的任务

4.线程池的状态

5. 线程池的执行流程

6.ConcurrentHashMap jdk1.8的优化:

1.数组长度超过8转化为红黑树,

2.写数据时候 加锁优化,

3.扩容时候的优化,协助扩容,

4.计数器的优化,LongAdder。

7.java8中提供了那些函数式接口?

Function(一个入参一个出参)、Consumer(一个入参无返回值),Supply (无参一个返回值),BIFunction(两个入参一个返回值),Predicate 推理接口

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}
@FunctionalInterface
public interface BiFunction<T, U, R> {
    R apply(T t, U u);
}

@FunctionalInterface
public interface Supplier<T> {
    T get();
}
@FunctionalInterface
public interface Predicate<T> {

}

mvcc 的实现原理  MVC2.C多版本并发控制原理总结(最终版) - 郭慕荣 - 博客园 (cnblogs.com)


在展示之前,我先简化一下Read View,我们可以把Read View简单的理解成有三个全局属性

  • trx_list(名字我随便取的):一个数值列表,用来维护Read View生成时刻系统正活跃的事务ID
  • up_limit_id:记录trx_list列表中事务ID最小的ID
  • low_limit_id:ReadView生成时刻系统尚未分配的下一个事务ID,也就是目前已出现过的事务ID的最大值+1
  • 首先比较DB_TRX_ID < up_limit_id, 如果小于,则当前事务能看到DB_TRX_ID 所在的记录,如果大于等于进入下一个判断
  • 接下来判断 DB_TRX_ID 大于等于 low_limit_id , 如果大于等于则代表DB_TRX_ID 所在的记录在Read View生成后才出现的,那对当前事务肯定不可见,如果小于则进入下一个判断
  • 判断DB_TRX_ID 是否在活跃事务之中,trx_list.contains(DB_TRX_ID),如果在,则代表我Read View生成时刻,你这个事务还在活跃,还没有Commit,你修改的数据,我当前事务也是看不见的;如果不在,则说明,你这个事务在Read View生成之前就已经Commit,你修v改的结果,我当前事务是能看见的MVCC多版本并发控制原理总结(最终版) - 郭慕荣 - 博客园 (cnblogs.com)

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值