java面试题整理( 三 )


四十.ReadWriteLock 和 StampedLock
ReadWriteLock:读写锁 , 允许多线程并发读操作 。 StampedLock:相对于ReadWriteLock的一个优化 , ReadWriteLock并发读线程回阻塞写线程 。 而StampedLock则不会 。
四十一.如何让 Java 的线程彼此同步?
wait、notify、park、unpark
四十二.CyclicBarrier 和 CountDownLatch区别?
CyclicBarrier:控制并发进入的现成的数量 CountDownLatch:减数器 , 主线程可以阻塞等待 , 知道减数器为零 。
四十三.线程池实现原理?

java面试题整理文章插图
四十四.线程池核心的构造参数?
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAlivesTimes:非核心线程存活时间
workQueue:等待队列
handler:拒绝策略
四十五.如何在 Java 线程池中提交线程?
execute:无法获取返回值、submit:可以通过futureTask获取返回值
四十六.既然提到可以通过配置不同参数创建出不同的线程池 , 那么 Java 中默认实现好的线程池又有哪些呢?请比较它们的异同
newFixedThreadPool:指定数量的线程池 , 核心线程数和最大线程数一样 。
newCachedThreadPool:缓存线程池 , 核心线程数为零 , 但最大线程数是Integer.MAX_VALUE,线程存活时间为60s 。
newSingleThreadExecutor:核心线程数和最大线程数都是一个线程 , 保证任务的顺序执行 。
四十七.Java 中各个线程是怎么彼此看到对方的变量的?
四十八.请谈谈 volatile 有什么特点 , 为什么它能保证变量对所有线程的可见性?
可以保证可见性 , 不能保证原子操作 , 如i++
四十九.请对比下 volatile 对比 Synchronized 的异同 。
1.volatile是轻量级的
2.多线程并发访问volatile不会阻塞
3.volatile只保证可见性 , 不能保证原子操作
五十.ThreadLocal 是怎么解决并发安全的?
每个线程存储的是本地变量副本 , 没有共享数据 。 线程当然安全了 。 但是线程中是无法获取到在主线程中设置的ThreadLocal的值的 。 他的一个子类可以 。
五十一.什么是spring , 有哪些模块?
java框架 , 模块包括spring core、spring web、spring mvc、spring context、spring dao、spring orm、spring dao
五十二.使用spring框架带来哪些好处?
解耦、aop、声明式事务、对其他框架开放、
五十三.BeanFactory 和 ApplicationContext 有什么区别?
ApplicationContext继承自BeanFactory , 前者丰富了很多功能 。 如:国际化、aop、加载上下文... 并且Application是对于bean预加载的 , 而BeanFactory是懒加载的 。
五十四.spring有几种配置方式?
xml、注解、java类
xml:
注解: @Component("userDao")
public class userDao{......}
java:使用@Configuration注解需要作为配置的类 , 表示该类将定义Bean的元数据 , 使用@Bean注解相应的方法 , 该方法名默认就是Bean的名称 , 该方法返回值就是Bean的对象 。
五十五.springBean生命周期?

java面试题整理文章插图
创建-》初始化-》使用-》销毁
五十六.Spring bean元素的作用域?

  • 当通过Spring容器创建一个Bean实例的时候 , 不仅可以完成bean实例的实力化 , 还可以为bean指定作用域 。 Spring bean元素的支持以下5种作用域:
  • Singleton:单例模式 , 在整个spring IOC容器中 , 使用singleton定义的bean将只有一个实例 。
  • Prototype:多例模式 , 每次通过容器中的getBean方法获取prototype定义的beans时 , 都会产生一个新的bean的实例 。
  • Request:对于每次Http请求 , 使用request定义的bean都会产生一个新的实例 , 只有在web应用时候 , 该作用域才会有效 。
  • Session:对于每次Http Session , 使用session定义的Bean都将产生一个新的实例 。
  • Globalsession:每个全局的Http Sesisonn , 使用session定义的本都将产生一个新的实例 。
五十七.spring inner beans?
在bean中声明另一个bean作为属性
五十八.spring中的bean是线程成安全的吗?
  • Spring框架并没有对单例的bean进行多线程的封装处理 , 线程安全问题和并发问题 , 需要我们开发者自己考虑 。
  • 但实际上 , 大部分的Spring bean并没有可变的状态(比如:service类和dao类) , 所有在某种程度上来说Spring单例bean是线程安全的 。 如果bean有多种状态的话(比如:View Model对象) , 就需要自行考虑线程安全问题 。
五十九.什么是自动装配?