1.多线程的问题
volatile:保证了变量的可见性,一般可用于多个线程中的判断
Thread.sleep(long)可以不在synchronized的块下调用,而且使用Thread.sleep()不会丢失当前线程对任何对象的同步锁(monitor);
object.wait(long)必须在synchronized的块下来使用,调用了之后失去对object的monitor, 这样做的好处是它不影响其它的线程对object进行操作。
如何等待线程的处理结果:feature模式
2.系统的整体架构
3.浏览器输入网址后到底经历了哪些步骤
DNS域名解析
TCP连接的建立,三次握手
发起HTTP连接
到nginx
到web服务器
找到html文件
浏览器解析html代码,并请求html代码中的资源
到web服务器,再通过rpc到service,再到数据库
浏览器对页面进行渲染呈现给用户
TCP断开连接
4.数据库存储引擎,我们用的是哪种,为什么要用这种?
用SHOW ENGINES; 来查询数据库的存储引擎。
用的是InnoDB存储引擎,支持事务。
MyISAM基于ISAM存储引擎,MyISAM拥有较高的插入、查询速度,但不支持事务,不支持外键。
MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。
5. map,arrayList, linkedList数据结构
map是由数组+链表组成的, map扩容,resize();
arrayList数组
linkedList就链表
6.服务突然挂掉后的排查方案
看jvm日志, +HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/dump.bin -XX:+PrintGCDetails -XX:ErrorFile=/data/logs/dump-error.log
7.rpc与http哪个好哪个差,为什么?
rpc :序列化与反序列化
http比rpc多了几次握手,还有josn的解析转换等。
8.vue的生命周期
vue能简单使用,但不时很熟
9.vue怎么做到双向绑定
应该是有监听机制,具体没了解
10.缓存与数据库一致性问题
写数据时,先删除缓存,再写数据库
读数据时,先读缓存,没有就都数据库,再写缓存
在分布式环境下上面的思路还有漏洞。
用分布式锁
11.集群与分布式有什么区别
集群是一个服务部署多个实例
分布式是按业务拆分不同的独立的服务
12.集群部署时,开发代码应该注意什么
session共享,可使用Redis来保存会话
synchronized方式不再适用,应使用分布式锁
13.dubbo的架构
服务提供方发布服务到服务注册中心;
服务消费方从服务注册中心订阅服务;
服务消费方调用已经注册的可用服务;
还有监控与后台管理
14.mysql数据库的乐观锁与悲观锁怎么实现
乐观锁 表结构加版本字段,更新时检查版本号。
悲观锁 查询时加for update
15.mysql的主从备份原理
通过bin-log日志,下面是百度的答案。
master开启bin-log功能,日志文件用于记录数据库的读写增删
需要开启3个线程,master IO线程,slave开启 IO线程 SQL线程,
Slave 通过IO线程连接master,并且请求某个bin-log,position之后的内容。
MASTER服务器收到slave IO线程发来的日志请求信息,io线程去将bin-log内容,position返回给slave IO线程。
slave服务器收到bin-log日志内容,将bin-log日志内容写入relay-log中继日志,创建一个master.info的文件,该文件记录了master ip 用户名 密码 master bin-log名称,bin-log position。
slave端开启SQL线程,实时监控relay-log日志内容是否有更新,解析文件中的SQL语句,在slave数据库中去执行。
16.不用标签语言,js怎么在页面中插入表格?
这其实是js基础,
var tab = document.createElement("table");
tab.rows[i].insertCell(j).innerHTML=i+''+j; 29 tab.rows[i].cells[j].style.background='green'
17.消息队列的实现原理
简单的说,生产者将消息发送到mq服务器,mq服务器将消息保持到队列中,在将消息发送到监听者。 还有失败重试,消息的事务支持,如果一个消息处理失败,事务回滚,消息重新回到队列中。 还有消息的持久化。
18.对java封装、继承、多态是怎么理解的。
这是java基础
19.公司没有专门的产品经理,药剂直接出差到客户现场,将客户的描述转换成功能。
这个也没有太好的办法,只有加强沟通。沟通完后,再后续的工作过程中找几个里程碑跟客户确认,免得做的系统不是客户想要的。
20.你组里的一个开发,代码一直写的很烂,你怎么处理。
通过开发前的代码设计,后面的代码走查,复盘来解决。
21.高并发的问题
我觉得解决这个问题,要将系统自上而下分层,请求数量从上往下 要呈漏斗状,从前端开始不要用户一直点击就一直请求后台,动静分离,静态资源可以单独搞个服务器, 后台先查缓存,查到了直接返回,也可以将请求存再队列中,一个个顺序执行,最后才访问数据库。
22.什么情况下会内存溢出,什么情况下会内存泄漏,怎么解决?
内存溢出指程序在申请内存,没有足够的内存供其使用,出现 out of memory ;
内存泄漏是指程序在申请内存后,无法释放已申请的内存空间。(我主要觉得一些静态的引用会产生内存泄漏,比如静态的list中放了一些没用的对象)
23.我们为什么要统一生成id, 不用数据库自增的id
我们系统没分库,本来是可以用数据库自增的id,但以后可能会分库,方便扩展。
24.mybatis 可以延迟加载吗
在真正使用数据的时候才发起查询,不用的时候不查询关联的数据,延迟加载又叫按需查询(懒加载)
<collection property="accountList" ofType="com.example.domain.Account" column="id" select="com.example.dao.AccountDao.findAllByUid"/>
25.抽象工厂设计模式
是围绕一个超级工厂创建其他工厂
主要解决接口选择的问题。
26.缓存击穿的问题
缓存击穿:就是略过缓存了,直接请求数据库,导致数据库挂了