A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 逆风TO 于 2019-5-27 11:19 编辑

公司名称:西安丝路软件有限公司
地址:西安市高新区科技二路72号西安软件园凌翼广场10401号
1. 请解释Spring Bean的生命周期?
SpringBean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。
Springbean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。
1.  初始化之后调用的回调方法。
2.  销毁之前调用的回调方法。
Spring框架提供了以下四种方式来管理bean的生命周期事件:
·        InitializingBean和DisposableBean回调接口
·        针对特殊行为的其他Aware接口
·        Bean配置文件中的Custom init()方法和destroy()方法
·        @PostConstruct和@PreDestroy注解方式
使用customInit()和 customDestroy()方法管理bean生命周期的代码样例如下:
<beans>
    <beanid="demoBean" class="com.howtodoinjava.task.DemoBean"
           init-method="customInit"destroy-method="customDestroy"></bean>
</beans>

2、Spring框架中的单例Beans是线程安全的么?
Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Springbean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。
3、请说出你所知道的线程同步的方法。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

4、描述Cookie 和Session 的作用区别和各自的应用范围
Cookie:主要用在保存客户端,其值在客户端与服务端之间传送,不安全,存储的数据量有限。Session:保存在服务端,每一个 session 在服务端有一个 sessionID 作一个标识。存储的数据量大,安全性高。占用服务端的内存资源。
5、synchronized 和 ReentrantLock 有什么不同(以前面试被问过)
      a.这两种方式最大区别就是对于Synchronized来说,它是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock它是JDK 1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成。
      b.Synchronized进过编译,会在同步块的前后分别形成monitorenter和monitorexit这个两个字节码指令。在执行monitorenter指令时,首先要尝试获取对象锁。如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,相应的,在执行monitorexit指令时会将锁计算器就减1,当计算器为0时,锁就被释放了。如果获取对象锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。
     c. ReentrantLock由于ReentrantLock是java.util.concurrent包下提供的一套互斥锁,相比Synchronized,ReentrantLock类提供了一些高级功能,主要有以下3项:
         1.等待可中断,持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,这相当于Synchronized来说可以避免出现死锁的情况。
         2.公平锁,多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁,Synchronized锁非公平锁,ReentrantLock默认的构造函数是创建的非公平锁,可以通过参数true设为公平锁,但公平锁表现的性能不是很好。
         3.锁绑定多个条件,一个ReentrantLock对象可以同时绑定对个对象。
6、ThreadLocal 用途是什么,原理是什么,用的时候要注意什么      
我们知道,在多线程程序中,同一个线程在某个时间段只能处理一个任务.我们希望在这个时间段内,任务的某些变量能够和处理它的线程进行绑定,在任务需要使用这个变量的时候,这个变量能够方便的从线程中取出来.ThreadLocal能很好的满足这个需求,用ThreadLocal变量的程序看起来也会简洁很多,因为减少了变量在程序中的传递.
2.ThreadLocal的原理是怎么样的?
    每个运行的线程都会有一个类型为ThreadLocal.ThreadLocalMap的map,这个map就是用来存储与这个线程绑定的变量,map的key就是ThreadLocal对象,value就是线程正在执行的任务中的某个变量的包装类Entry.
3. ThreadLocal保存变量的生命周期是怎么样的?
    ThreadLocal保存变量的生命周期 <=任务的生命周期<=线程的生命周期
ThreadLocal.set,ThreadLocal.remove实际上是同样的道理。


120 个回复

倒序浏览
您需要登录后才可以回帖 登录 | 加入黑马