- 请画出线程的生命周期,并列出创建线程的方式


线程的5种状态:新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead) 创建方式:继承Thread 实现Runnable 实现Callable 使用Executors问题来了: 1. sleep结束后进入什么状态? 2. Runnable和Callable的区别? 3. FutureTask是什么 4. Executors创建的几种线程池? ThreadPoolExecutor的参数?
- 请描述Synchuronized关键字,列出他常用锁。 请描叙一下Volatile和Synchronized的区别。
Java 虚拟机中的同步(Synchronization)基于进入和退出管程(Monitor)对象实现 ReentrantLock 区别:
- volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
- volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
- volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
- volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
- volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化
问题延伸:
ReentrantLock 和 Synchuronized有什么区别?
- spring中bean的生命周期和作用域
Spring Bean 生命周期比较复杂,可以分为创建和销毁两个过程,详情自行百度。

- spring注解@Autowired,@Resource,@Qualifier
@Autowired采取的策略为按照类型注入(ByType)。
public class UserService { @Autowired private UserDao userDao; }当一个类型有多个bean值的时候,会造成无法选择具体注入哪一个的情况,这个时候我们需要配合着@Qualifier使用。@Qualifier告诉spring具体去装配哪个对象。
public class UserService { @Autowired @Qualifier(name="userDao1") private UserDao userDao; }@Resource默认按照ByName自动注入。
public class UserService { @Resource private UserDao userDao; @Resource(name="studentDao") private StudentDao studentDao; @Resource(type="TeacherDao") private TeacherDao teacherDao; @Resource(name="manDao",type="ManDao") private ManDao manDao; }①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

