Java 多线程Spring 等相关的面试题目转

当下热点的多线程、Spring部分面试真题及解析分享给大家,希望大家都能顺利通过面试,拿下高薪。赶紧码住吧!

1)利用Thread.wait()同步线程,可以设置超时时间吗?

A:可以                             B:不可以

答案:A

解析:可以设置超时,函数原型为wait(longtimeout)和wait(long timeout, int nanos)timeout代表最大的等待ms数,nanos代表额外的等待时间,单位为纳秒。

(2)在一个线程中sleep(1000)方法,将使得该线程在多少时间后获得对CPU的控制(假设睡眠过程中不会有其他事件唤醒该线程)?

A:正好1000ms 

B:1000ms不到 

C:=>1000ms     

D:不一定

答案:C

解析:sleep()方法指定的时间为线程不会运行的最短时间。当线程休眠时间结束后,会返回到可运行状态,不是运行状态,还需要等待CPU调度执行。因此,sleep()方法不能保证该线程睡眠到期后就开始执行。

(3)JavaDaemon线程,setDaemon设置必须要(  )

A:在start之前

B:在start之后

C:前后都可以

答案:A。

(4)关于守护线程的说法,正确的是(  )

A:所有非守护线程终止,即使存在守护线程,进程运行终止

B:所有守护线程终止,即使存在非守护线程,进程运行终止

C:只要有守护线程或者非守护进程其中之一存在,进程就不会终止

D:只要所有的守护线程和非守护线程终止运行之后,进程才会终止

答案:A。

(5ExecutorServicesubmitexecute分别有什么区别呢?

答案:

1)execute没有返回值,如果不需要知道线程的结果就使用execute方法,性能会好很多。

2)submit返回一个Future对象,如果想知道线程结果就需要使用submit提交,而且它能在主线程中通过Future的get方法捕获线程中的异常。

(6)使用ThreadLocal为什么会导致内存泄漏?

答案:

图片

从上图中可以看出,key用的是弱引用,而弱引用在GC的时候可能会被回收。这样就会导致在ThreadLocalMap中会存在一些key为null的键值对(Entry)。因为key变成null了,所以它对应的value也就无法被访问了,但是这些Entry本身是无法被回收的,因为还存在一条强引用链。Thread->ThreadLocalMap->Entry。这个Entry在线程退出之前是无法被回收的。当线程池被使用的时候,很多线程会长期存在,从而导致内存的泄漏。

那么如何避免内存泄漏呢?建议在使用完后调用ThreadLocal.remove方法来解除这个引用关系,从而让GC可以回收这个不再被使用的Entry。

(7yield方法的作用是什么?

答案:

Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。也就是说yield方法会让出CPU的使用权让线程从运行状态变成可运行状态从而让让相同优先级的其他线程获得执行机会。当然操作系统也可能会马上让这个线程继续获取CPU的使用权从而转换到运行状态。

8)为什么要使用Spring?

答案:

Spring被广泛使用,主要有以下几个原因。

1)它启动方便,使用Spring Boot可以快速地初始化一个项目,方便的增加组件,部署只需要一个jar文件或者war文件即可。

2)Spring框架的特性保证了它的代码污染率极低,既不会因为开发功能的不断迭代使项目变得臃肿,也不会因为开发人员编码习惯的不同而使项目代码变的混乱。

3)使用Java语言有先天的优势,那就是丰富的类库,基本上所有的库都有适配Spring的版本,可以方便集成和替换。

4)Spring中最常被提到的特性,控制反转、面向切面等,这些特性不光是语言层面的、框架的特性,更是编程的思想,可以提高项目的健壮性,方便迭代和重构。

5)低入侵性,低耦合,丰富的组件支持,优秀的工程性和运行效率,支持微服务,先进的编程思想。

(9)Spring Bean是线程安全的吗

答案:

Spring Bean 主要分为两种,scope 为 singleton 和 scope 为 prototype。prototype 类型的 Bean 每次都是注入一个新对象,各个线程之间不存在 Bean 的共享,可以认为是线程安全的。singleton 的 Bean 又分为两种情况,无状态的 Bean和有状态的 Bean。

无状态的 Bean 不会对 Bean 的成员执行查询以外的操作,例如 Spring mvc 的 Controller、Service、Dao 等,无状态的 Bean 是线程安全的。

Spring 框架并没有对单例 Bean 进行任何多线程的封装处理,有状态的 Bean 不是线程安全的。

(10)Spring AOP和AspectJ AOP有什么区别

答案:

Spring AOP 旨在通过 Spring IOC 提供一个简单的 AOP 实现,以解决编码人员面临的最常出现的问题。这并不是完整的AOP解决方案,它只能用于Spring容器管理的 Bean。Spring AOP 是通过 JDK 动态代理和 CGLIB 动态代理的方式实现。

AspectJ是一个易用的功能强大的AOP框架,是 Spring AOP 的一种实现方式,AspectJ 使用静态代理的方式实现。AspectJ 比 Spring AOP 拥有更全面的切面功能和更好的性能。

(11) Spring Data Jpa与JPA的区别?

答案:JPA(Java Persistence API)是一种持久层规范,也是EJB3规范的一部分,并不是一个ORM框架,只是定义了一些API,但没提供具体实现,它的作用是使得应用程序以统一的方式访问持久层。

Spring Data Jpa 是在JPA规范的基础上提供了一个JPA数据访问抽象,同时也大大简化了持久层的CRUD操作。但它并不是一个JPA的实现,hibernate才是JPA的一个实现。

(12)为什么不建议在实际的应用程序中使用 Spring Data Rest?

答案:

确实Spring Data Rest 很适合快速原型制造。rest英方全称为Representational State Transfer(表述状态转移)。但是要注意一点,通过 Spring Data Rest你可以把你的数据实体作为 Restful服务直接发布。这是不建议在实际项目中使用的原因。

当你设计 Restful服务器的时候,最佳实践表明,你的接口应该考虑到两件重要的事情:你的模型范围和你的客户。用 Spring Data REST,你不需要再考虑这两个方面,只需要作为 REST 服务发布实体。这是在快速开发原型时使用 Spring Data Rest的原因。

(13)微服务之间是如何独立通信的?

答案:有两种方式:

1)直接通过远程过程调用(Remote Procedure Invocation)来访问别的服务。

2)使用异步消息来做服务间通信,服务间通过消息管道来交换消息。

两者各有优点,远程过程调用简单直接,不需要中间件。消息需要中间件支持,增加了复杂性。远程过程调用只支持请求/响应模式,并且客户端与服务端在请求时必须都可用,增加了耦合性。而消息通过中间件缓存消息,在服务端和客户端之间实现了解耦。支持的通信机制更多。如通知、请求/异步响应、发布/订阅、发布/异步响应等。

(14) 请谈谈SpringCloud微服务的启动流程。

答案:在基础服务设施,如依赖的数据库,常用的缓存框架Redis,消息队列中间件等都已启动的情况下,先启动注册中心,再启动配置中心,然后启动服务提供方服务,然后再启动服务调用方服务,再启动网关服务,再启动监控服务,大致是这个流程。

(15) Springcloud微服务架构,你认为哪些是必备组件?

答案:

在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、网关路由、断路器、配置中心、消息总线、服务监控,链路跟踪,授权认证,数据库访问,缓存管理等,由这些基础组件相互协作,便能组建了一个功能相对比较完善的微服务系统。

在SpringCloud微服务系统中,一种常见的负载均衡方式是,客户端的请求首先经过负载均衡(Nginx),再到达服务网关(gateway或zuul集群),然后再到具体的服务。服务统一注册到高可用的服务注册中心集群,服务的所有的配置文件由配置服务管理,配置服务的配置文件放在git仓库,方便开发人员随时修改配置。

(16) MVC的各个部分都有那些技术来实现?

答案:

在Java领域,MVC各部分相关的技术众多。

模型(model)层:hibernate、mybatis、jpa, spirngJdbc,Javabean或EJB等。

控制器(controller):severlet、Struts的action、 SpringMVC的 controller等。

视图(view)层:Jsp、FreeMarker、Velocity、Html等。

(17) Dubbo的管理控制台能做什么?如何使用?

答:管理控制台主要包含:路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能。

管理控制台不是一定要使用Dubbo搭建分布式系统,但是有了它我们可以对服务进行很好的治理和监控。

从Dubbo2.6.1开始,dubbo-admin、dubbo-monitor被单独拆分出来了,项目为incubator-dubbo-ops,GitHub地址:https://github.com/apache/incubator-dubbo-ops。

启动dubbo-admin之前必须先启动注册中心,如果是Zookeeper,则需要先启动Zookeeper。dubbo-admin2.6.1版本可以直接打成jar包,直接用java -jar 命令来启动。需要在application.properties中最关键要配置好dubbo.registry.address就可以了。其他可以采用默认配置 ,启动完成后,就可以进入控制台,通过配置文件中的服务端口与用户名密码就可以登录访问管理控制台了。

猜你喜欢

转载自blog.csdn.net/weixin_50764555/article/details/121454691