Java中高级面试题总览(二)(3)

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: Java中高级面试题总览(二)

32.两个进程能否共享内存空间

33锁的等级:方法锁、对象锁、类锁

34.多线程模拟实现生产者/消费者模型

35.开启多个线程,如何保证顺序执行,有哪几种实现方式,或者如何保证多个线程都执行完再拿到结果

36、延迟队列的实现方式,delayQueue 和时间轮算法的异同

37、非常多个线程(可能是不同机器)相互之间需要等待协调,才能完成某种工作,问怎么设计这种协调方案

38、怎么实现分布式锁(redis+zookeeper)

39、什么是锁升级降级

40、线程池队列满的时候怎么处理

41.java线程能被中断么,中断一定能成功么

42、线程启动用 start 方法还是 run

43、线程常用的并发类及关键字

44、有哪些无锁数据结构,无锁实现的原理是什么

45、i++是不是线程安全,为什么

不安全的,因为在操作i++的时候,是分步骤做的,可以理解为:
tp = i;
tp2 = i+1;
i=tp2;
如果线程1在执行第一条代码的时候,线程2访问i变量,这个时候,i的值还没有变化,还是原来的值,所以是不安全的
这也是经典的内存不可见问题,那么把 i加上 volatile 让内存可见是否能解决这个问题呢? 答案是:不
能。因为 volatile 只能保证可见性,不能保证原子性。多个线程同时读取这个共享变量的值,就算保证其他线
程修改的可见性,也不能保证线程之间读取到同样的值然后相互覆盖对方的值的情况。

46、说说 JDK1.6 之后的synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优化吗

JDK1.6 对锁的实现引入了大量的优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。

锁主要存在四中状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,他们会随着竞争的激烈而逐渐升级。注意锁可以升级不可降级,这种策略是为了提高获得锁和释放锁的效率。

关于这几种优化的详细信息可以查看:synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比

jdk1.7源码

1.HashMap的实现原理

2.HashSet的实现原理

3.Hashtable的实现原理

HashMap结构中,是允许保存null的,Entry.keyEntry.value均可以为null。但是HashTable中是不允许保存null

HashTable类继承自Dictionary类,实现了三个接口,分别是MapCloneablejava.io.Serializable

HashTable的主要方法的源码实现逻辑,与HashMap中非常相似,有一点重大区别就是所有的操作都是通过synchronized锁保护的。只有获得了对应的锁,才能进行后续的读写等操作。

4.LinkedHashMap的实现原理

5.LinkedHashSet 的实现原理

LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,其所有的方法操作上又与 HashSet 相同

6.ArrayList的实现原理

7.LinkedList的实现原理

LinkedList存储元素的数据结构是双向链表结构,由存储元素的结点连接而成,每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可。

8.ConcurrentHashMap的实现原理

开源框架与技术

tomcat

  1. 简单讲讲 tomcat结构
  2. tomcat启动流程
  3. tomcat怎么处理请求,流程是怎样的
  4. tomcat如何调优
  5. maxThreads、maxConnections、acceptAccount区别
  6. tomcat默认支持并发数,怎么修改?
  7. tomcatNIO线程模型

spring

1.Spring加载流程(bean初始化)

2.Spring事务管理总结

3.spring的事务传播属性以及隔离级别

4.Springmvc中DispatcherServlet初始化过程

5.Bean如何优雅的销毁

context.registerShutdownHook(); 是一个钩子方法,当jvm关闭退出的时候会调用这个钩子方法,在设计模式之 模板模式中 通过在抽象类中定义这样的钩子方法由实现类进行实现,这里的实现类是AbstractApplicationContext,这是spring 容器优雅关闭的方法

Spring 的 init-method 和 destory-method_安德里亚的成长-CSDN博客_init-method=

6.简述一下Spring结构

7.什么是IOC

8.spring:AOP的实现原理

核心概念

1、切面( aspect) : 类是对物体特征的抽象,切面就是对横切关注点的抽象

2、横切关注点: 对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。

3、连接点( joinpoint) : 被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。

4、切入点( pointcut) : 对连接点进行拦截的定义

5、通知( advice) : 所谓通知指的就是指拦截到连接点之后要执行的代码, 通知分为前置、后置、异常、最终、环绕通知五类。

6、目标对象: 代理的目标对象

7、织入( weave) : 将切面应用到目标对象并导致代理对象创建的过程

 

Spring 提供了两种方式来生成代理对象: JDKProxy 和 Cglib,具体使用哪种方式生成由

AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。 默认的策略是如果目标类是接口,

则使用 JDK 动态代理技术,否则使用 Cglib 来生成代理。

9.Spring的生命周期

10.BeanFactory和ApplicationContext区别

11.Spring实例化Bean的方式

12.Spring各种事务实现及区别

13.Spring编程事务与声明事务的区别

14.SpringMVC的工作原理

15.Spring怎么配置事务(具体说出一些关键的xml元素)

16.springmvc用到的注解,作用是什么,原理

17.springboot启动机制

18.Spring循环依赖的处理(单例、多例状态下的处理,懒加载一定能处理掉循环依赖么?)

19.@Autowired 与@Resource和@Qualifier注解的区别

@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了

@Autowired是根据类型进行自动装配的。如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题

可能存在多个UserDao实例

@Autowired  

public void setUserDao(@Qualifier("userDao") UserDao userDao) {  

  this.userDao = userDao;  

}  

20.@transactional注解在什么情况下会失效,为什么

1、service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。

2、@Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。

3、默认情况下,Spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。 通俗一点:你写代码出现的空指针等异常,会被回滚,文件读写,网络出问题,spring就没法回滚了

netty

1.netty的线程模型是什么?netty是如何基于reactor模型上实现的

2.netty的HashedWheelTimer 的用法,实现原理,是否出现过调用不够准时,怎么解决

3.netty的心跳处理在弱网下怎么办

4.netty的通讯协议是什么样的

https://blog.csdn.net/u013252773/article/category/2104567

5.netty原理

dubbo

1.说下Dubbo的架构图和组件

2.Dubbo容错机制有哪些?分别适用那些场景?

3.Dubbo线程模型

Dubbo的 protocol标签提供了三个参数 dispatcher,threads(默认为100)
和 threadpool来为我们自定义DUBBO协议下的线程模型

Dubbo的线程模型_击水三千里的专栏-CSDN博客_dubbo 线程模型

4.Dubbo负载均衡策略与算法

5.Dubbo结果缓存

dubbo提供了三种结果缓存机制:
lru:基于最近最少使用原则删除多余缓存,保持最热的数据被缓存
threadlocal:当前线程缓存
jcache:可以桥接各种缓存实现
使用方式
<dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService">
         <dubbo:method name="sayHello" timeout="60000" cache="lru"/>
</dubbo:reference>

6.dubbo怎么服务降级

第1种
在远程调用异常时,服务端直接返回一个固定的字符串(也就是写死的字符串)
具体配置:
在服务调用方配置mock参数:
<dubbo:reference id="xxxService" interface="com.x..service.xxxxService" check="false" 
mock="return 123456..." />
说明:配置了mock参数之后,假设在调用服务的时候,远程服务没有启动,或者各种网络异常了,那远程服务
会把这个mock配置的值返回,也就是会返回123456...
第2种
在远程调用异常时,服务端根据自定义mock业务处理类进行返回)
具体配置:
在服务调用方配置mock参数:
<dubbo:reference id="xxxService" interface="com.x..service.xxxxService" check="false" mock="true" />
说明:配置了mock参数之后,假设在调用服务的时候,远程服务没有启动,或者各种网络异常了,那远程服务
会去寻找自定义的mock业务处理类进行业务处理。
因此还需配置一个自定义mock业务处理类
在接口服务xxxxService的目录下创建相应的mock业务处理类,同时实现业务接口xxxxService(),接口名要
注意命名规范:接口名+Mock后缀,mock实现需要保证有无参的构造方法。
public class xxxxServiceMock implements xxxxService {
    @Override
    public String getXXXX(int id) {
        return "this is exception 自定义....";
    }
}

Dubbo服务降级设置_击水三千里的专栏-CSDN博客

7.dubbo怎么优雅停机

对于通过dubbo Main方式启动dubbo容器的,只需在启动前添加java环境变量-Ddubbo.shutdown.hook=true即
可。
对于tomcat等web容器方式启动dubbo的,需要在关闭时执行方法ProtocolConfig.destroyAll();
kill -9 默认对于dubbo Main方式启动的,优雅停机不生效

8.dubbo怎么自动dump线程池

dubbo 内部有几种线程模型,都是使用 java 线程池实现的,任务被拒绝后会输出堆栈信息。我们可以看它是怎
么实现的

Dubbo 源码分析之自定义线程池拒绝策略(使用 Java 程序 Dump 线程堆栈信息)_苏苏爱自由-CSDN博客

9.Dubbo 的原理

10.dubbo如何一条链接并发多个调用

11.Dubbo的网络协议是什么

1dubbo协议
 Dubbo缺省协议采用单一长连接和NIO异步通讯,使用基于于netty+hessian(序列化方式)交互。适合于小数据
量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。Dubbo缺省协议不适合传送大数据
量的服务,比如传文件,传视频等,除非请求量很低。
2 rmi协议
走java二进制序列化,多个短连接,适合消费者和提供者数量差不多,适用于文件的传输,一般较少用,在大数据
量下的传输性,建议使用rmi协议
3 hessian协议
走hessian序列化协议,多个短连接,适用于提供者数量比消费者数量还多,适用于文件的传输,一般较少用
4 http协议
走json序列化
5 webservice

12.讲下Dubbo服务注册与发现的基本流程

13.Dubbo有台节点挂了是怎么处理的

14.dubbo的优缺点是什么

15.dubbo怎么修改失败重试次数,默认是多少

16.dubbo内部机制,数据怎么流转的

17.dubbo遇到那些坑

18.Dubbo运行时,突然所有的zookeeper全部宕机,Dubbo是否还会继续提供服务

可以,因为刚开始初始化的时候,消费者会将提供者的地址等信息拉取到本地缓存,所以注册中心挂了可以继续通信

19.Dubbo源码

20.Dubbo使用zookeeper注册中心

21.Dubbo怎么使用redis作为注册中心

<dubbo:registry address="redis://127.0.0.1:6379" username="admin" password="password"></dubbo:registry>
<dubbo:protocol name="dubbo" port="20880" />

22.Dubbo最佳实践

23.Dubbo调优经验

zookeeper

1.Zookeeper的用途是什么

2.Zookeeper选举的原理

Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。

一、basic paxos流程(推荐别人,超过半数投票机制)
1 .选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;
2 .选举线程首先向所有Server发起一次询问(包括自己);
3 .选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存
储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记
录表中;
4.  收到所有Server回复以后,就计算Server中zxid最大的那个Server,并将这个Server相关信
息设置成下一次要投票的Server;
5.  线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1
的Server票数, 设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否
则,继续这个过程,直到leader被选举出来。
二、fast paxos流程(推荐自己,全票机制)
在选举过程中,某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch
和zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出
Leader 

3.zookeeper原

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。

为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。

epoch:可以理解为当前集群所处的年代或者周期,每个 leader 就像皇帝,都有自己的年号,所以每次改朝换代, leader 变更之后,都会在前一个年代的基础上加 1。这样就算旧的 leader 崩溃恢复之后,也没有人听他的了,因为 follower 只听从当前年代的 leader 的命令。

每个Server在工作过程中有三种状态:

LOOKING:当前Server不知道leader是谁,正在搜寻

LEADING:当前Server即为选举出来的leader

FOLLOWING:leader已经选举出来,当前Server与之同步

4.zookeeper的同步流程

把follower的数据同步给leader的过程:
1. leader等待server连接;
2.Follower连接leader,将最大的zxid发送给leader;
3.Leader根据follower的zxid确定同步点;
4.完成同步后通知follower 已经成为uptodate状态;
5.Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。

5.zookeeper角色

6.zookeeper的Leader工作流程

1 .恢复数据;
2 .维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型;
3 .Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理

7.zookeeper的Follower工作流程

1. 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
2 .接收Leader消息并进行处理;
3 .接收Client的请求,如果为写请求,发送给Leader进行投票;
4 .返回Client结果。

8.Zookeeper Watch机制原理

9.zookeeper数据一致性

10.什么是zab协议

ZAB(ZooKeeper Atomic Broadcast)协议是为协调分布式服务,ZooKeeper专门设计的一种支持漰溃恢复的原子
广播协议。
ZAB协议的两种基本模式:崩溃恢复模式和消息广播模式。

11.zookeeper使用场景

(1)配置管理
(2)集群管理 

12.为什么zookeeper不用paxos,而是用的zab算法

ZK的每一个操作都具有隐形事务要求,通过强一致性保证数据节点的数据的顺序性(FIFO)。Paxos协议无法实现多个写操作的顺序性,或者通过串行操作实现,则以牺牲效率为代价。

mybatis

1.Mybatis的底层实现原理

1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。


2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。


3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。

4)创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。


5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。


6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。


7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。


8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
77 2
|
28天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
67 14
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
1月前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
36 6
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
73 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
135 4
|
2月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
125 1
Java面试题之Java集合面试题 50道(带答案)
|
2月前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
73 5