深圳强时科技有限公司(二面)
- 因为是周末上午的延续,所以下午没有什么自我介绍的环节……
- 聊项目--------分布式部署多个模块到不同服务器、高可用特性、Zookeeper中的主从部署形成集群、对请求数据的负载均衡到多个节点、正向***和反向***……。
- 如何对Java服务进行调优?-------硬件设备、操作系统,数据库中的SQL优化、索引优化、NoSQL的引入,架构上框架分布式的概念,业务层面的优化……结合自身的实际项目经验来阐述。
- 你了解哪些常用的设计模式?-------手写出几个模式例子……(单例、观察者模式、装饰者模式、工厂模式、***模式……)
- 简单阐述下Java内存模型内部原理?--------手动画出一个模型逻辑图(主要的线程栈和堆),每个运行在虚拟机都拥有自己的线程栈,也仅能供自己访问、可见,创建本地变量。线程和线程之间的传递是原始类型变量的拷贝,而不是本身。堆属于存放线程所创建的对象……
- Java中多线程操作下的三个特性?---------原子性一系列操作不允许被中途打断,必须全部执行或者不执行;可见性是指当多个线程访问同一个共享变量时,一个线程对其修改,其他线程都可以看到;有序性多个线程对同步代码的操作,只有竞争到锁才能执行,反之没有同步的措施就会造成线程执行的无序性……。
- volatile关键字是如何保证可见性的?------------也就是volatile的原理。在多核或者多个CPU的场景下都某个线程需要修改共享变量时,需要从内存中拷贝到自己CPU的缓存中,CPU对缓存中的数据进行修改后,将修改后的值刷新到内存中,其他线程通过嗅探总线上传播过来的数据监测自己缓存的值是否过期,如果过期了就会重新从内存中把数据读取到自己的缓存中进行处理……。
- 谈谈你对SpringIOC和DI的理解?--------IOC翻译过来就是控制反转,将原本由Java程序员创建对象的工作交给Spring框架去完成;DI翻译过来就是依赖注入,Spring框架负责创建bean对象时,负责动态地将依赖对象注入到Bean组件……
- SpringAOP的理解?-----------直接翻译过来就是面向切面的编程。提供声明式服务和自定义切面,实际场景比如在业务中加入日志、安全
- SpringMVC处理请求的流程?-----------画图阐述:用户发送请求-->前端控制器(根据URL选择哪一个页面控制器进行处理并把请求委托给它)-->页面控制器(接收请求进行功能处理,收集并绑定一个对象作为命令对象然后委托给业务对象进行处理)-->调用业务对象返回模型/逻辑数据-->页面控制器-->ModelAndView-->前端控制器-->根据返回的逻辑视图名进行渲染-->返回控制器响应给客户
- 你分析过mybatis工作流程原理吗?--------所谓流程原理,个人认为是对mybatis环境搭建后的具体应用。读取可信配置文件并返回流对象。根据流对象解析创建工厂对象。通过工厂对象创建session,通过session结合映射文件做出一系列的操作……
- mybatis中的配置映射文件中#{}和一些${}的区别?-------------#{}是预编译处理时会将其替换为?,调用PreparedStatement的set方法获取值。${}替换成变量的值……
- mybatis的一二级缓存?--------------框架默认是开启一级缓存的,其存储作用域为session,当session的flush和close之后,所有缓存会被清空。二级缓存作用域为Mapper命名空间,可以自定义存储源Eh***默认不打开二级缓存,要开启二级缓存需要手动配置。缓存数据更新机制,当执行了更新数据操作,默认该作用域下所有的select中的缓存将被clear
- 让你设计一个秒杀系统,你会如何设计和思考?-------属于聊项目业务中的需求和实现。秒杀系统的需求就是在同一时间大量的请求对指定商品进行购买交易,但系统一定要扛得住这些大量并发请求。所谓实现就是项目设计的高性能数据库的读写拆分、热点优化……,一致性就是高并发对数据库商品库存字段的扣除要一致……,高可用某台服务器宕机对客户来说是透明的……
其他闲聊话题略……
技术栈总结:JVM和多线程并发的基础,SSM框架的熟悉应用,穿插实际项目的技术栈。