java 常见面试题总结
1.mysql 的隔离级别和锁
- mysql 的锁分为共享锁(又叫S锁)和拍他锁(又叫X锁),S锁----允许多个事务并发的读取同一个资源,互补干扰。X锁----事务T加上排他锁后,其他事务不能再加任何锁。
- read uncommit ---没有锁,所以会出现脏读
- read commit ----共享锁,允许读,但是不允许写。---会出现,不可重复读(一个事务范围内,多次读取的结果不一样)
- 可重复读--- X锁,读写都不允许,保证了可重复读。但是不能保证幻读,mysql引入了mvcc来解决这个问题。
2.Spring bean的生命周期 - instantiation ---实例化
- properties injection ---属性注入
- setBeanName ---of bean name Aware接口的实现调用
- setBeanClassLoader----BeanClassLoaderAare接口的方法
- setBeanFactory ----BeanFactoryAware接口
- PostProcessBeforeInitialization-----BeanPostProcessor接口
- afterPropertiesSet-----InitializingBean 接口
- 自定义的init-method----在spring xml中
- postProcessAfterInitilazation ---BeanPostProcessor接口
- destroy----DisposableBean 接口
- 自定义的destroy method
3.设计一个抢红包系统 - 用redis + lua https://www.jianshu.com/p/b58ed2fe6976?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
- 原理:生成一个正太分布的红包值,比如100元,生成10个包。然后利用redis+lua的原子性,把hongbaoList(-1操作),hongbaoConsumedList(+1操作),hongbaoConsumedMap(去重操作)放在一起执行。 注意jedis是和某太机器建立会话,发送lua脚本,采用用redis单线程来保证原子性和抢红包的单线程竞争。
4.分布式锁的公平竞争、线程锁的公平竞争 - 大多是通过单机,或者单线程里面的锁或者时钟顺序性来保证。
- zookeeper在一个指定节点的lockpath下创建临时会话顺序节点(类似于mysql的自增)。谁创建的节点序号小,谁有限获得锁。其他节点都会监听比自己小的节点,在监听事件中判断自己是否最小,从而获得锁
- redis 通过lua的原子性脚本,保证setnx+pexpire的执行原子性(防止没有expire,其他获取锁的机器渴死),类似与MULTI / EXEC 和单线程来保证事务,其实利用了单线程带来的隔离性,串行化,不被打断。不算严格的原子性
- mysql的唯一键保证,其他线程不能插入
- 线程的公平竞争,使用队列,公平不允许插队,非公平允许插队。见问题8
5.线程wait和sleep的区别
6.dubbo自定义注解的实现
- 调用端---- 实现spring提供的NamespaceHandler 接口,向Spring 容器注册 BeanDifinationParser,通过parser转换相关的xml到Spring 的bean
- 服务端----- Service Bean,dubbo服务提供者都实现 dubbo:service,Spring把 dubbo:service 解析成一个ServiceBean,ServiceBean实现了ApplicationListener和InitializingBean接口,afertPorpertiesSet中调用export方法暴露这些服务方法。即注册到provider的map里面
7.类的加载
8.ReentrantLock 机制,公平和非公平
9.DDD理解,战略,战术
- 首先领域---就是问题域,即我们要研究的问题边界,不要把所有问题放到一起,我们的问题有自己的边界,是为领域。首先我们系统要做成什么样,然后对问题进行拆分,划分边界,成为领域。比如一个电商可以接拆为---会员中心,商品中心,订单中心,交易中心,库存中心,营销促销中心。但是领域划分有时候会产生领域复杂问题,比如商品中心,有商品和库存,那么随着维护困难,可以再次拆分子领域,也就是我们常说的垂直切分。会员包括用户和账户,也可以垂直切分。
- 按功能可以分为核心域(赚钱的)、通用域、支撑域
- 战略是对系统整体的规划,划分,DDD的战略设计主要包括领域/子域、通用语言、限界上下文和架构风格等概念。
- 战术是设计模式,领域对象,entity,值对象。聚合。Domain Service,Repository,Domain Event