拿下最终的offer!抉择吧,命运!

1、RabbitMQ消息队列消息丢失问题怎么解决?

RabbitMQ消息丢失的三种情况:

1.生产者发送消息到交换机时数据丢失:消息确认模式confirmCallback,返回给生产者,提示消息发送交换机成功;

2.交换机发送消息到队列时数据丢失:同样是消息确认模式,ReturnCallback,如果发送失败将消息退回给生产者;

3.消费者消费消息是数据丢失:默认是自动确认,我们只要配置成手动确认即可,消费者接收消息以后调用channel.basicAck()方法出现异常则获取消息失败,需要重新发送消息。

 

2、springboot的常用注解有哪些?

1.@SpringBootApplication: 它 封 装 了 核 心 的;@SpringBootConfiguration +@EnableAutoConfiguration +@ComponentScan 这三个类,大大节省了程序员配 置时间,这就是 SpringBoot 的核心设计思想;

2.@EnableScheduling 是通过@Import 将 Spring 调度框架相关的 bean 定义都加载到 IoC 容器;

3.@MapperScan:spring-boot支持mybatis组件的一个注解,通过此注解指定mybatis 接口类的路径,即可完成对 mybatis 接口的扫描;

4.@RestController 是 @Controller 和 @ResponseBody 的 结 合 , 一 个 类 被 加 上 @RestController 注解,数据接口中就不再需要添加@ResponseBody,更加简洁;

5.@RequestMapping,我们都需要明确请求的路径;

6.@GetMappping,@PostMapping, @PutMapping, @DeleteMapping 结 合 @RequestMapping 使用, 是 Rest 风格的, 指定更明确的子路径;

7.@PathVariable:路径变量注解,用{}来定义 url 部分的变量名;

8.@Service 这个注解用来标记业务层的组件,我们会将业务逻辑处理的类都会加上这个 注解交给 spring 容器。事务的切面也会配置在这一层。当让 这个注解不是一定要用。 有个泛指组件的注解,当我们不能确定具体作用的时候 可以用泛指组件的注解托付给 spring 容器;

9.@Component 和 spring 的注解功能一样, 注入到 IOC 容器中;

10.@ControllerAdvice 和 @ExceptionHandler 配合完成统一异常拦截处理。

 

3、讲一下springboot 的好处?

版本锁定:解决是 maven 依赖版本容易冲突的问题,集合了常用的并且测试过的所有版本,使用了 Starter(启动器)管理依赖并能对版本进行集中控制,如下的父工程带有版本号, 就是对版本进行了集中控制;

起步依赖 :解决了完成某一个功能要整合的 jar 包过多的问题,集合了常用的 jar 包;

自动配置:解决了整合框架或者技术的配置文件过多,集合了所有的约定的默认配置;

内置 Tomcat:通过内置的 tomcat,无需再用其他外置的 Tomcat 就直接可以运行 javaEE 程序。

 

4、HashMap底层原理?

出现的太频繁了,之前已做讲解。

 

5、线程的创建方式?

同上。

 

6、安全:hassmap和hasstable的区别?那个不安全?为什么?怎么便利hashmap?

(1):区别:一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现;

(2)二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的

(3)三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

(4)为什么?最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异

(5)遍历hashmap:两种方式,Map map=new HashMap();

Iterator iter=map.entrySet().iterator();s

Iterator iter=map.keySet().iterator();

 

7、线程有几种状态?谈谈多线程的安全问题;问到线程和同步?写一个生产者和消费者模式; 考虑高并发的问题。

(1)线程通常有五种状态,创建,就绪,运行,阻塞,和死亡;

第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态手写字符串反转和冒泡排序;

第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。

第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。

第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。

第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪

(2)多线程的安全问题:总结来说,多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的。线程安全问 题多是由全局变量和静态变量引起的,当多个线程对共享数据只执行读操作,不执行写操作时,一般是线程安全的;当多个线程都执行写操作时,需要考虑线程同步 来解决线程安全问题。

(3)线程和同步:说明Java线程的两个特性,可见性和有序性。多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现.

java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 

    将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 

从而保证了该变量的唯一性和准确性

(4)生产者和消费者模式:存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。

(5)模式:1.wait()和notify();2.await()和signal(),即线程锁的方式;3.阻塞队列的方式;

(6)高并发:手段无非是切割(纵向,横向)和负载均衡。纵向分隔主要是按业务(功能)来分,也就是所谓面向服务架构,横向分隔方式比较多,主要依赖于所处理的对象属性负载均衡则可以是镜像(部署)分布(同样的功能部署几份)和计算分布(一个问题分几个子问题在不同的机器上运行,然后合并结果)。当然,这些手段是可以综合利用的,最终可以做成多流水线分布式计算模式;

 

其他问题:

1.介绍下整个项目流程,谈谈你自己负责的模块?别人的模块是否了解?

2.讲解下自己负责的模块,这个模块如何实现的?做这个项目时候遇到怎样的问题?

3.你在项目组中的角色和优势?

4.做项目的时间,项目组几个人,多长时间完成?

另附资源下载:关注 “Java面试百分百
1,后台回复:面试资料,可获取一份最新的Java面试资料。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值