1. 线程基础
    1. Thread
      1. 建立线程方式
        1. extends Thread
        2. implements Runnable
      2. 为什么Thread中有些方法是deprecated?
        1. suspend
        2. resume
        3. stop
      3. 为什么不建议依赖Thread的优先级?
        1. 调度方式
          1. 抢占式
          2. 时间片式
        2. 线程模型
          1. 绿色线程模型
          2. 本地线程模型
      4. interrupt和interrupted区别是什么?
        1. interrupt
        2. interrupted
    2. synchronized、volatile
      1. 基本概念
        1. 引用、状态的可见性
        2. 操作的互斥性
      2. synchronized
        1. 可见性
        2. 互斥性
        3. 执行
          1. (1)获得同步锁(互斥)
          2. (2)清空线程工作内存
          3. (3)从主存拷贝变量副本到线程工作内存(对本线程可见)
          4. (4)在线程中对变量进行处理
          5. (5)将变量从线程工作内存写回到主存(对其他线程可见)
          6. (6)释放锁(解除互斥)
      3. volatile
        1. 可见性
        2. 执行
          1. 直接操作主存
          2. (1)本线程可以看到其他线程写入的最新结果
          3. (2)其他线程也可以看到本线程写入的最新结果
  2. 线程安全
    1. 什么是线程安全?
    2. 怎样保证?
      1. 原则
        1. 保证对象的引用、状态对其他线程正确可见
        2. 保证对象状态操作的正确性
      2. 怎么达到上述原则?
        1. 明确共享资源
          1. 类变量
          2. 实例变量
        2. 明确共享资源的操作方式
          1. 哪些变量只需要保证引用、状态的可见性
          2. 除可见性外,哪些变量还需要保证操作的互斥性
        3. 选择适合种类的对象
          1. 不变对象
          2. 基本不变对象
          3. 可变对象
      3. ThreadLocal
        1. 线程变量隔离
        2. 防止OOM
          1. set
          2. get
          3. remove
  3. J.U.C包
    1. 线程池
      1. 工作线程
      2. 任务队列
      3. 协调线程的机制
    2. 并发集合
      1. 将协调机制内置
      1. 公平、非公平锁
      2. 一锁多条件
    3. 原子操作
      1. 引入乐观锁机制
    4. 辅助类
  4. 线程间协调
      1. 分类
        1. 分类1
          1. 乐观锁
          2. 悲观锁
        2. 分类2
          1. 公平锁
          2. 非公平锁
        3. 分类3
          1. 可重入锁
          2. 不可重入锁
      2. 悲观锁
        1. 内置
          1. synchronized
        2. J.U.C
          1. ReentrantLock
        3. 比较
          1. 相同
          2. 悲观锁
          3. 可重入
          4. 不同
          5. 内置:非公平锁
          6. J.U.C:公平锁、非公平锁
      3. 乐观锁
        1. CAS
          1. 内存值
          2. 旧值
          3. 新值
        2. 和悲观锁比较
          1. 自旋设置新值
          2. 不需上下文切换
          3. 并发高时,CPU会占用过高
    1. 条件变量
      1. 三要素
        1. 等待条件
        2. 等待队列
      2. 内置
          1. synchronized
        1. 等待条件满足时调用方法
          1. wait
          2. notify
          3. notifyAll
        2. 等待队列
          1. 等待在synchronized的对象上
      3. J.U.C
          1. Lock
        1. 等待条件满足时调用方法
          1. Condition.await
          2. Condition.singal
          3. Condition.singalAll
        2. 等待队列
          1. 等待在Condition上
          2. 一个Lock可以有多个Condition
  5. 线程活跃度
    1. 死锁
      1. 锁序一致
    2. 锁饥饿
      1. 非公平锁
    3. 活锁
      1. 不正确的重试
  6. 性能
    1. 怎样提高?
      1. 减少锁的范围
      2. 减小锁的粒度
      3. 减少上下文切换
    2. 怎样测试?
      1. 测试陷井
        1. 垃圾回收充分
        2. 要动态编译成本地码
        3. 代码执行路径、线程竞争程序要与真实情况尽量一致
        4. 要注意dead code优化
      2. 工具
        1. J.U.C
          1. CountDown
          2. CylicBarrier
        2. ConTest
        3. jucprofiler
  7. JMM
    1. 指令重排
      1. javac生成字节码时
      2. 字节码被JIT编译成本地码时
      3. 处理器乱序、并发执行指令
    2. JMM规则
      1. 为什么要有这些规则?
        1. 保证代码的执行是可预测的
      2. happens-before
        1. 可见性规则(变量的顺序可见性)
        2. 偏序关系
        3. 规则
          1. (1)同一个线程中的每个action都happens-before于出现在其后的任何一个action
          2. (2)对一个monitor的解锁happens-before于每一个后续对同一个monitor的加锁
          3. (3)对volatile字段的写入操作happens-before于每一个后续的同一个字段的读操作
          4. (4)Thread.start()的调用会happens-before于启动线程里面的动作
          5. (5)Thread中的所有动作都happens-before于其他线程检查到此线程结束或者Thread.join()中返回或者Thread.isAlive()==false
          6. (6)一个线程调用另一个线程的interrupt happens-before于被中断的线程发现中断(通过抛出InterruptedException,或者调用isInterrupted和interrupted)
          7. (7)一个对象构造函数的结束happens-before与该对象的finalizer的开始
          8. (8)如果A动作happens-before于B动作,而B动作happens-before与C动作,那么A动作happens-before于C动作
        4. 利用happens-before分析代码
      3. final
        1. 可见性规则(对象状态的可见性)
        2. 规则
          1. 所有线程都能看到final域的值
          2. 所有线程都能看到任何通过final域触及到的变量(一个final的数组中的元素,一个final的HashMap中的元素)
  8. 附录
    1. JSR
      1. JSR是指向JCP提出新增标准化技术规范的正式请求,以向Java平台增添新的API和服务
      2. JSR-166
        1. JSR-166主要是关于J.U.C的技术规范(jdk5)
        2. JSR-166x(jdk6新增类:Deques、Navigable collections)
        3. JSR-166y(jdk7新特性:fork-join)
    2. 更多研究的主题
      1. 线程与GC
      2. 线程与ClassLoader
      3. 线程与安全
      4. 并发算法
    3. 参考资料
      1. Java Concurrency in Practice
      2. Java Thread
      3. Effective-Java
      4. JDK 5.0 Documentation
      5. 动态编译与性能测量
      6. 安全构造技术
      7. volatile的使用
      8. Java 理论与实践: 变还是不变?
      9. 剖析java.util.concurrent锁
      10. 使用 ConTest 进行多线程单元测试