吐血整理!这200道阿里P6必备Java面试题,我简直太爱了( 七 )

  • 线程死亡(DEAD)线程会以下面三种方式结束 , 结束后就是死亡状态 。run()或 call()方法执行完成 , 线程正常结束 。线程抛出一个未捕获的 Exception 或 Error , 线程异常结束 。调用stop停止 。直接调用该线程的 stop()方法来结束该线程—该方法通常容易导致死锁 , 不推荐使用 。
  • 什么是乐观锁?
    • 乐观锁是一种乐观思想 , 即认为读多写少 , 遇到并发写的可能性低 , 每次去拿数据的时候都认为别人不会修改 , 所以不会上锁 , 但是在更新 的时候会判断一下在此期间别人有没有去更新这个数据 , 采取在写时先读出当前版本号 , 然后加锁操作(比较跟上一次的版本号 , 如果一样则更新) , 如果失败则要重复 , 读 比较 写的操作 。
    • Java中的乐观锁基本都是通过 CAS 操作实现的 ,  CAS 是一种更新的原子操作 ,  比较当前值跟传入值是否一样 , 一样则更新 , 否则失败 。
    什么是悲观锁?
    • 悲观锁是就是悲观思想 , 即认为写多 , 遇到并发写的可能性高 , 每次去拿数据的时候都认为别人会修改 , 所以每次在读写数据的时候都会上 锁 , 这样别人想读写这个数据就会 block 直到拿到锁 。Java中的悲观锁就是Synchronized , AQS框架下的锁则是先尝试CAS乐观锁去获取锁 ,  获取不到 , 才会转换为悲观锁 , 如RetreenLock 。
    什么是可重入锁(递归锁)
    • 本文里面讲的是广义上的可重入锁 , 而不是单指 JAVA 下的 ReentrantLock 。可重入锁 , 也叫 做递归锁 , 指的是同一线程 外层函数获得锁之后  , 内层递归函数仍然有获取该锁的代码 , 但不受 影响 。在 JAVA 环境下 ReentrantLock 和 synchronized 都是 可重入锁 。
    公平锁与非公平锁
    • 公平锁(Fair)加锁前检查是否有排队等待的线程 , 优先排队等待的线程 , 先到先得 。
    • 非公平锁(Nonfair)加锁时不考虑排队等待问题 , 直接尝试获取锁 , 获取不到自动到队尾等待
    • 对比非公平锁性能比公平锁高 5~10 倍 , 因为公平锁需要在多核的情况下维护一个队列 。Java 中的 synchronized 是非公平锁 ,  ReentrantLock 默认的 lock()方法采用的是非公平锁 。
    在 Java 中 Executor 和 Executors 的区别?
    • Executors 工具类的不同方法按照我们的需求创建了不同的线程池 , 来满足业务的需求 。
    • Executor 接口对象能执行我们的线程任务 。
    • ExecutorService 接口继承了 Executor 接口并进行了扩展 , 提供了更多的方法我们能获得任务执行的状态并且可以获取任务的返回值 。使用 ThreadPoolExecutor 可以创建自定义线程池 。
    • Future 表示异步计算的结果 , 他提供了检查计算是否完成的方法 , 以等待计算的 完成 , 并可以使用 get()方法获取计算的结果 。
    MySQL面试题什么是数据库引擎?
    • 数据库存储引擎是数据库底层软件组织 , 数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据 。不同的存储引擎提供 不同的存储机制、索引技巧、锁定水平等功能 , 使用不同的存储引擎 , 还可以 获得特定的功能 。现在许多不同的数据库管理系统都支持多 种不同的数据引擎 。
    • 存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated。
    InnoDB底层数据结构是什么?适用什么场景?
    • InnoDB底层数据结构为B+树 , B+树的每个节点对应InnoDB的一个page , page的大小是固定的 , 一般设为16k , 其中非叶子节点只有键值 , 叶子节点包含数据 。
    • 适用场景经常更新的表 , 适合处理多重并发的更新请求 。支持事务 。可以从灾难中恢复(通过bin-log日志等)外键约束(只有它支持外键约束)支持自动增加列属性(auto_increment)
    MyIASM的优点和缺点是什么?