点击上方蓝字关注我们
1 Q:Bean工厂和“上下文”有什么区别?
1、BeanFactory可以理解为含有bean集合的工厂类。BeanFactory包含了 bean 的定义,以便在接收到客户端请求时将对应的bean实例化。
2、BeanFactory 还能在实例化对象的时生成协作类之间的关系。此举将 bean自身与bean 客户端的配置中解放出来。BeanFactory 还包含了bean 生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
3、从表面上看,applicationContext 如同 beanFactory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但applicationContext 在此基础上还提供了其他的功能:提供了支持国际化的文本消息、统一的资源文件读取方式、已在监听器中注册的bean的事件。
2 Q:有哪几种GC机制?
1、引⽤计数法(没有被java采⽤):
原理:对于⼀个对象A,只要有任何⼀个对象引⽤了A,则A的引⽤计数器就加1,当引⽤失效时,引⽤计数器就减1,只要对象A的引⽤计数器的值为0,则对象A就会被回收。
问题:引⽤和去引⽤伴随加法和减法,影响性能;很难处理循环引⽤。
2、标记清除法:原理:现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。⼀种可⾏的实现是,在标记节点,⾸先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引⽤的垃圾对象。然后在清除阶段,清除所有未被标记的对象。
问题:标记和清除两个过程效率不⾼,产⽣内存碎⽚导致需要分配较⼤对象时⽆法找到⾜够的连续内存⽽需要触发⼀次GC操作。
3、标记压缩法:原理:适合⽤于存活对象较多的场合,如⽼年代。它在标记-清除算法的基础上做了⼀些优化。标记阶段⼀样,但之后,将所有存活对象压缩到内存的⼀端。之后,清除边界外所有的空间。
优点:解决了标记- 清除算法导致的内存碎⽚问题和在存活率较⾼时复制算法效率低的问题。
4、复制算法:原理:将原有的内存空间分为两块,每次只使⽤其中⼀块,在垃圾回收时,将正在使⽤的内存中的存活对象复制到未使⽤的内存块中,之后清除正在使⽤的内存块中的所有对象,交换两个内存的⻆⾊,完成垃圾回收。
问题:不适⽤于存活对象⽐较多的场合,如⽼年代。
5、分代回收法:原理:根据对象存活周期的不同将内存划分为⼏块,⼀般是新⽣代和⽼年代,新⽣代基本采⽤复制算法,⽼年代采⽤标记整理算法。
3 Q:MYSQL为什么要使用视图,有何优缺点?使用场景?
1、为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以储存的数据值形式存在。行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。视图是由基本表(实表)产生的表(虚表)。视图的建立和删除不影响基本表。对视图内容的更新(添加,删除和修改)直接影响基本表。当视图来自多个基本表时,不允许添加和删除数据。视图的操作包括创建视图,查看视图,删除视图和修改视图。
2、优点:
查询简单化。视图能简化用户的操作。数据安全性。视图使用户能以多种角度看待同一数据,能够对机密数据提供安全保护逻辑数据独立性。视图对重构数据库提供了一定程度的逻辑独立性。
3、缺点:
耗性能。数据库必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也把它变成一个复杂的结合体,需要花费一定的时间。修改限制。当用户试图修改视图的某些行时,数据库必须把它转化为对基本表的某些行的修改。
4、使用场景:
重用SQL语句;简化复杂的SQL操作。在编写查询后,可以方便的重用它而不必知道它的基本查询细节;使用表的组成部分而不是整个表;保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限;更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
4 Q:什么是脏读?幻读?不可重复读?
1、脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
2、幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
3、不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
5 Q:ThreadLocal 是什么?有什么用?
ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。简单说ThreadLocal就是一种以空间换时间的做法, 在每个Thread 里面维护了一个以开地址法实现的ThreadLocal.ThreadLocalMap,把数据进行隔离,数据不共享,自然就没有线程安全方面的问题了。
6 Q:什么是乐观锁和悲观锁
1、乐观锁:就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将比较-替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,那么就应该有相应的重试逻辑。
2、悲观锁:还是像它的名字一样,对于并发间操作产生的线程安全问题持悲观状态,悲观锁认为竞争总是会发生,因此每次对某资源进行操作时,都会持有一个独占的锁,就像synchronized,不管三七二十一,直接上了锁就操作资源了。
点个在看你最好看