【面试准备】华为二面准备

类加载机制

SSM注解的实现原理

反射和注入

双亲委派机制

1. 当前ClassLoader首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。
每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,等下次加载的时候就可以直接返回了。

2.  当前classLoader的缓存中没有找到被加载的类的时候,委托父类加载器去加载,依次递归(即:父类加载器采用同样的策略,首先查看自己的缓存,然后委托父类的父类去加载,一直到bootstrp ClassLoader),如果父类加载器可以完成类加载任务,就成功返回;

3.  当所有的父类加载器都没有加载的时候,再由当前的类加载器加载,并将其放入它自己的缓存中,以便下次有加载请求的时候直接返回。

类加载的三种方式

一.静态加载

1.

通过new关键字来创建Test的实例对象。

二.动态加载

1.

【面试准备】华为二面准备_第1张图片

通过Class.forName()来加载类,然后调用类的newInstance()方法实例化对象。

2.

【面试准备】华为二面准备_第2张图片

通过类加载器的loadClass()方法来加载类,然后调用类的newInstance()方法实例化对象。

高并发场景下如何保证数据库和缓存的数据一致性

只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?

经典做法

最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern。
读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
更新的时候,先删除缓存,然后更新数据库。

如何在高并发情况下保证数据的一致性

 

对多个更新操作的业务加事物注解。在数据库表中加一个vesion版本控制字段(初始值为0)在更新操作前查询并记录该字段,更新操作完成vesion+1,再次查询vesion与更新操作前记录的值相差1说明前后数据一致,否则回滚更新操作

1.通过悲观锁实现 for update

2.通过乐观锁实现,加字段

3.针对秒杀系统,可以采取将并发请求串行化。放在一个队列中,处理对数据库的写操作

4.通过redis实现,读和写都操作redis。写redis数据时,同时产生一条业务相关联的日志数据。单独开个任务或者消息队列来对日志数据进行读取,获取里面的对数据库的操作。然后进行写数据库。

5.因为redis支持事务,所有写操作可以通过lua脚本来支持对数据库的操作。

1.业务层面乐观锁CAS,使用版本号解决ABA问题,实际使用中使用时间戳,更新的时候把查出来的时间戳带上,如果更新失败可以自旋,获取最近值和时间戳,直到更新成功。
2.DB层面开启一个事务,然后select一行for update给这一行加上排它锁,再去更新行,然后提交,其他事务就会阻塞在select for update。
3.分布式锁适合竞争不激烈的情况保证一致性,因为性能比较差,按CAP理论来讲应该是保证了CP放弃了A,zk或者redis保证一致性P,只有拿到锁的线程才能执行,保证一致性C

http://www.unibeta.org.cn/article/25

http://www.360doc.com/content/18/0426/20/41344223_748994212.shtml

你可能感兴趣的:(面试)