每天三道面试题2019-09-14

1、说说springmvc的执行流程

  1. 客户端发起请求request
  2. 前端控制器DispatcherServlet接收到request,请求处理器映射器HandlerMapping查找Handler
  3. HandlerMapping根据url查找到对应的Handler,返回一个执行链给DispatcherServlet
  4. DispatcherServlet拿到执行链后请求处理器适配器HandlerAdapter处理执行
  5. HandlerAdapter执行相应的Handler。
  6. Handler(平时也称为Controller)内部运行完毕后返回一个ModelAndView给HandlerAdapter
  7. HandlerAdapter又将ModelAndView返回给DispatcherServlet
  8. DispatcherServlet请求视图解析器VR进行视图解析
  9. VR解析完返回一个View(jsp、freemaker…)给前端控制器
  10. DispatcherServlet对视图进行渲染,将模型数据填充到request域
  11. 返回response给客户端。

2、Mysql存储引擎的区别(InnoDb和MyISAM)

在这里插入图片描述
原文链接

  1. MyISAM不支持外键,InnoDb支持外键
  2. MyISAM不支持事务,InnoDb支持事务
  3. MyISAM对数据的操作使用表锁(读数据加S锁,写数据加X锁),即使是操作一条数据也会对整张表进行锁定,故其不适合高并发的操作;InnoDb对数据的操作使用的是行锁,操作是只锁定某一行,不影响其他行的操作,适合高并发的操作。
  4. MyISAM只缓存索引,不缓存真实数据,对内存的要求较低;InnoDb不仅缓存索引还缓存数据,所以对内存的要求较高,而且内存大小对性能有决定性的影响。
  5. MyISAM的表空间小(由三个文件构成:索引文件,表结构文件,数据文件,可以存放在不同目录);InnoDb表空间大,若使用共享表空间,其存储空间大小不受系统的限制(有的系统限制文件最大为2GB),最大为64TB,若使用独占表空间,大小会受到系统的限制
  6. MyISAM使用非聚集索引,其索引的data域存放的是数据的物理地址,故其具有较高的插入、查询性能;InnoDb使用聚集索引,key为表主键,辅索引的data域存放的是主键,故使用辅索引查找数据最后是通过主索引找到数据的,写入数据时索引需要维持B+树结构,性能没有MyISAM好。
  7. 、MyISAM关注性能;InnoDb关注事务

详细参考:https://blog.csdn.net/keil_wang/article/details/88392433

3、线程间为什么要进行通信?

cpu是随机进行线程的,但是有些时候我们希望cpu按照我们的规律执行线程,所以需要线程间进行通信。

线程间通信的几种方式和常见场景:

  1. 使用休眠唤醒机制:
    Object的wait()、notify()、notifyAll()
    Condition的await(),signl(),signlAll()
  2. CountDownLatch门栓机制,适用于一个线程的执行需要等待另外几个线程执行后才执行。
  3. CycicBariier栅栏机制,适用于等待某个条件,全部线程一起执行,如赛跑比赛中所有运动员都要等待信号枪。
  4. Semaphore,适用于控制访问资源,如三台机器8个工人,只有获取到机器资源的工人才能进行操作,操作结束后释放资源。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java面试题真的很多,下面我来回答一个有关多线程的问题。 在Java中实现多线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。这两种方式有何区别? 继承Thread类的方式是直接定义一个类继承Thread,并重写它的run()方法。然后创建该类的对象,并调用对象的start()方法来启动线程。这种方式简单直接,但因为Java是单继承的,所以如果某个类已经继承了其他类,就不能再直接继承Thread类实现多线程。 实现Runnable接口的方式是定义一个类实现Runnable接口,并实现其唯一的抽象方法run()。然后创建Thread类的对象,将实现了Runnable的对象作为参数传递给Thread类的构造方法。最后调用Thread对象的start()方法来启动线程。这种方式灵活性更大,因为Java允许一个类实现多个接口,所以即使某个类已经继承了其他类,仍然可以通过实现Runnable接口来实现多线程。 另一个区别在于资源共享的问题。继承Thread类的方式,不管是数据还是方法,都是线程自己拥有的,不存在共享的情况。而实现Runnable接口的方式,多个线程可以共享同一个对象的数据和方法,因为多个线程共同操作的是同一个Runnable对象。 总结来说,继承Thread类方式简单直接,但只能通过单继承来实现多线程;实现Runnable接口方式更灵活,可以解决单继承的限制,并且多个线程可以共享同一个Runnable对象的数据和方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值