面试题(一)

平常项目中用过哪些设计模式?

单例模式,工厂模式,原型模式,建造者模式,适配器模式,享元模式,装饰者模式,策略模式,观察者模式,责任链模式,

模板方法模式,代理模式

简单描述下单例模式?

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。

4、实现方式分懒汉式,饿汉式等几种。

单例模式是线程安全的吗?

懒汉式的实例是在第一次使用时创建的,相应的静态工厂办法会先判断有没有实例,没有实例在进行创建。

然而这种创建方法时线程不安全的,如果有两个线程,同一时刻拿到单例对象,要去静态工厂办法访问,由于工厂办法没有锁,

那么很有可能这两个线程最终会拿到两个实例。

运行 Spring Boot 有哪几种方式?

用命令打包或者放到容器中运行

用 Maven 插件运行

直接执行 main 方法运行

微服务的优缺点是什么?说下你在项目中碰到的坑

优点:松耦合,聚焦单一业务功能,无关开发语言,团队规模降低。在开发中,不需要了解多有业务,只专注于当前功能,便

利集中,功能小而精。微服务一个功能受损,对其他功能影响并不是太大,可以快速定位问题。微服务只专注于当前业务逻辑

代码,不会和 html、css 或其他界面进行混合。可以灵活搭配技术,独立性比较舒服。

缺点:随着服务数量增加,管理复杂,部署复杂,服务器需要增多,服务通信和调用压力增大,运维工程师压力增大,人力资

源增多,系统依赖增强,数据一致性,性能监控。

第一个问题:springcloud 的优缺点?

优点:

1.耦合度比较低。不会影响其他模块的开发。

2.减轻团队的成本,可以并行开发,不用关注其他人怎么开发,先关注自己的开发。

3.配置比较简单,基本用注解就能实现,不用使用过多的配置文件。

4.微服务跨平台的,可以用任何一种语言开发。

5.每个微服务可以有自己的独立的数据库也有用公共的数据库。

6.直接写后端的代码,不用关注前端怎么开发,直接写自己的后端代码即可,然后暴露接口,通过组件进行服务通信。S

缺点:

1.部署比较麻烦,给运维工程师带来一定的麻烦。

2.针对数据的管理比麻烦,因为微服务可以每个微服务使用一个数据库。

3.系统集成测试比较麻烦

4.性能的监控比较麻烦。【最好开发一个大屏监控系统】

以上是我对 springcloud 的优缺点的一些见解,大家有其他可以评论,多加发表自己的见解。

第二问题:和 Springboot 的区别?

区别:

1.依赖关系:springboot 可以单独开发,可以 springcloud 必须依赖于 springboot 才能开发。

2.Spring Boo 可以快速开发单个微服务, SpringCloud 是一个基于 Spring Boot 实现的云应用开发工具,专助于全局服务

治理。3.聊聊并发事务带来的问题?

脏读(

Dirty read)

当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,

然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据可能就是“脏数据”,这就是脏

读。

说说事务的 ACID 特性?

原子性(

Atomicity)一致性(

Consistency)隔离性(

Isolation)

并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。

持久性(Durability)

为什么说 redis 能够快速执行

i. 绝大部分请求是纯粹的内存操作(非常快速)

ii. 采用单线程,避免了不必要的上下文切换和竞争条件

iii. 非阻塞 IO - IO 多路复用

Redis 的持久化机制

RDB 持久化

RDB 持久化即通过创建快照(压缩的二进制文件)的方式进行持久化,保存某个时间点的全量数据。RDB 持久化是 Redis 默认

的持久化方式。RDB 持久化的触发包括手动触发与自动触发两种方式。

AOF 持久化

AOF(

Append-Only-File)持久化即记录所有变更数据库状态的指令,以 append 的形式追加保存到 AOF 文件中。在服务器下

次启动时,就可以通过载入和执行 AOF 文件中保存的命令,来还原服务器关闭前的数据库状态。

单线程的 redis 为什么这么快

(一)纯内存操作

(二)单线程操作,避免了频繁的上下文切换

(三)采用了非阻塞 I/O 多路复用机制

对于大量的请求怎么样处理

redis 是一个单线程程序,也就说同一时刻它只能处理一个客户端请求;

redis 是通过 IO 多路复用(

select,epoll, kqueue,依据不同的平台,采取不同的实现)来处理多个客户端请求的

优点

速度快,支持丰富数据类型: String ,List,Set,Sorted Set,Hash 。持久化存储

2.redis 的缺点

1、由于 Redis 是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然 Redis 本身有 Key 过期策略,但是还是需要提前

预估和节约内存。如果内存增长过快,需要定期删除数据。

2、redis 是单线程的,单台服务器无法充分利用多核服务器的 CPU

Linux 下你常用的命令有哪些?

什么是线程饿死,什么是活锁。

三个线程 a、b、c 并发运行,b,c 需要 a 线程的数据怎么实现?

根据问题的描述,我将问题用以下代码演示,ThreadA、ThreadB、ThreadC,ThreadA 用于初始化数据 num,只有

当 num 初始化完成之后再让 ThreadB 和 ThreadC 获取到初始化后的变量 num。分析过程如下:考虑到多线程的不确定性,因此我们不能确保 ThreadA 就一定先于 ThreadB 和 ThreadC 前执行,就算 ThreadA 先执

行了,我们也无法保证 ThreadA 什么时候才能将变量 num 给初始化完成。因此我们必须让 ThreadB 和 ThreadC 去等

待 ThreadA 完成任何后发出的消息。

现在需要解决两个难题,一是让 ThreadB 和 ThreadC 等待 ThreadA 先执行完,二是 ThreadA 执行完之后给 ThreadB

和 ThreadC 发送消息。

解决上面的难题我能想到的两种方案,一是使用纯 Java API 的 Semaphore 类来控制线程的等待和释放,二是使用

Android 提供的 Handler 消息机制。

使用 RabbitMQ 有什么好处?

削峰

把消息压入 RabbitMQ 中可以缓冲系统压力。比如现在系统只能接受 2000 请求,但是一下子有 10000 个请求过来,

那么这个请求就会压在 RabbitMQ 中,那么就可以慢慢进行消费了。

异步

解耦

MQ 的缺点

虽然能提供削峰,异步,解耦,但是这个还是有很多要考虑的问题,消息丢失,重复消费。

MQ 消息队列如何避免消息重复投递或重复消费?

在消息生产时,MQ 内部针对每条生产者发送的消息生成一个 inner-msg-id,作为去重的依据(消息

投递失败并重传),避免重复的消息进入队列,在消息消费时,要求消息体中 必须要有一个 bizID(对

于同一个业务全局唯一) 作为去重的依据,避免同一条消息被重复消费。

JVM

什么情况下会发生栈溢出?

当线程请求的栈深度超过了虚拟机允许的最大深度时,会抛出

StackOverFlowError

异常。这

种情况通常是因为方法递归没终止条件。

新建线程的时候没有足够的内存去创建对应的虚拟机栈,虚拟机会抛出

OutOfMemoryError

异常。比如线程启动过多就会出现这种情况。

如何判断一个对象是否存活?

对堆垃圾回收前的第一步就是要判断那些对象已经死亡(即不再被任何途径引用的对象)。判断对象

是否存活有两种方法:引用计数法和可达性分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值