好未来面试问题整理

1、线程池的实现原理

  • 线程复用:将实现了Runnable接口的工作线程作为参数传入Thread,在Thread的run方法中调用Runnable的工作方法runWork,runWork里有一个while循环,会一个一个调用任务队列里的任务并顺序执行,所以达到了工作线程Runnable的复用。
  • 控制最大并发数:线程池设了两个参数:核心线程数corePoolSize、最大允许线程数maxMumPoolSize。添加任务时:当线程池中实际线程数小于核心线程数则直接创建工作线程执行该任务。当实际线程数大于核心线程数则将该任务放入任务队列等待空闲线程执行。如果任务队列满了并且实际线程数小于最大允许线程数,就会创建一个线程来执行该任务。如果队列满了且实际线程数大于最大允许线程数,则拒绝该任务。
  • 管理线程:管理线程包括线程复用,控制最大并发数,销毁线程。前两个以上已经介绍,接下来就说销毁线程。线程池中的线程的状态可以规定为RUNNING正在运行且可接受新任务,SHUTDOWN正在运行且不再接受新任务,STOP停止正在运行的任务且不再接受新任务。
    具体可参考http://blog.csdn.net/he90227/article/details/52576452

2、Spring是做什么的

  • Spring最核心的功能Ioc,可以看出spring是一个容器,用来管理类对象的。在容器启动的时候会根据配置文件里的配置装配类,处理类和类之间的依赖关系。当程序中需要类对象的时候可以直接去容器里get,实现了类之间解耦。
  • Spring另一个功能Aop,面向切面编程。就是将特定的可能多个地方都会使用的功能,例如日志、事务,独立出来,在需要这些功能的代码中通过配置来使用这些功能,实现了组件的可重用性,提高代码的简洁性。
  • Spring是一个开放的平台,为各个框架都提供方便的接口进行整合。

3、MySql存储引擎
Mysql根据对数据处理的需求不同,提供了以下几种存储引擎

  • MyISAM:表级锁。适用于选择密集型的表和插入密集型的表,但是不支持事务
  • InnoDB:支持行级锁和表级锁,只有使用索引查询数据的时候使用行级锁,其他时候使用表级锁。事务性存储索引。适用于需要事务支持、有外键约束、需要自动灾难恢复、更新密集、自动增长列的表
  • MEMORY:表级锁。存储介质是内存,同时支持散列索引和B数索引。适用于数据长度不变且短小,频繁被访问、数据是临时的且需要立即使用、数据都是不会产生严重影响的表
  • MERGE:一组表结构相同的MyISAM表,对这些MyISAM表同时进行操作。
  • ARCHIVE:归档。仅支持查询和插入操作,有很好的压缩机制,使用zlib压缩库,在记录被请求时会实时压缩,所以经常被用来当仓库使用。

    表级锁:加锁速度快,开销小,不会出现死锁,锁粒度大,所以出现锁冲突的概率最大,并发度也最低。
    行级锁:加锁速度慢,开销大,会出现死锁,锁粒度小,所以出现锁冲突的概率最小,并发度也最高。
    MyISAM锁:MyISAM的读锁和写锁是互斥的,写锁优先级高于读锁。
    InnoDB锁:共享锁、排他锁。

4、事务的四大特性和隔离级别

  • 原子性:事务要么成功,要么失败
  • 一致性:事务执行之前和执行之后状态一致性
  • 隔离性:并发事务之间要相互隔离
  • 持久性:事务一旦提交,对数据库的改变是永久的

    隔离级别

  • Serializable:可避免脏读、不可重复读和幻读

  • Repeatable Read:可避免脏读和不可重复读(MySql默认隔离级别)
  • Read Committed:可避免脏读
  • Read Uncommitted:什么都无法保证

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