• 线程基础升华
  • 第01讲:为何说只有 1 种实现线程的方法?
  • 第02讲:如何正确停止线程?为什么 volatile 标记位的停止方法是错误的?
  • 第03讲:线程是如何在 6 种状态之间转换的?
  • 第04讲:wait/notify/notifyAll 方法的使用注意事项?
  • 第05讲:有哪几种实现生产者消费者模式的方法?
  • 究竟什么是线程安全?
  • 第06讲:一共有哪 3 类线程安全问题?
  • 第07讲:哪些场景需要额外注意线程安全问题?
  • 第08讲:为什么多线程会带来性能问题?
  • 线程池
  • 第09讲:使用线程池比手动创建线程好在哪里?
  • 第10讲:线程池的各个参数的含义?
  • 第11讲:线程池有哪 4 种拒绝策略?
  • 第12讲:有哪 6 种常见的线程池?什么是 Java8 的 ForkJoinPool?
  • 第13讲:线程池常用的阻塞队列有哪些?
  • 第14讲:为什么不应该自动创建线程池?
  • 第15讲:合适的线程数量是多少?CPU 核心数和线程数的关系?
  • 第16讲:如何根据实际需要,定制自己的线程池?
  • 第17讲:如何正确关闭线程池?shutdown 和 shutdownNow 的区别?
  • 第18讲:线程池实现“线程复用”的原理?
  • 各种各样的“锁”
  • 第19讲:你知道哪几种锁?分别有什么特点?
  • 第20讲:悲观锁和乐观锁的本质是什么?
  • 第21讲:如何看到 synchronized 背后的“monitor 锁”?
  • 第22讲:synchronized 和 Lock 孰优孰劣,如何选择?
  • 第23讲:Lock 有哪几个常用方法?分别有什么用?
  • 第24讲:讲一讲公平锁和非公平锁,为什么要“非公平”?
  • 第25讲:读写锁 ReadWriteLock 获取锁有哪些规则?
  • 第26讲:读锁应该插队吗?什么是读写锁的升降级?
  • 第27讲:什么是自旋锁?自旋的好处和后果是什么呢?
  • 第28讲:JVM 对锁进行了哪些优化?
  • 并发容器面面观
  • 第29讲:HashMap 为什么是线程不安全的?
  • 第30讲:ConcurrentHashMap 在 Java7 和 8 有何不同?
  • 第31讲:为什么 Map 桶中超过 8 个才转为红黑树?
  • 第32讲:同样是线程安全,ConcurrentHashMap 和 Hashtable 的区别?
  • 第33讲:CopyOnWriteArrayList 有什么特点?
  • 阻塞队列
  • 第34讲:什么是阻塞队列?
  • 第35讲:阻塞队列包含哪些常用的方法?add、offer、put 等方法的区别?
  • 第36讲:有哪几种常见的阻塞队列?
  • 第37讲:阻塞和非阻塞队列的并发安全原理是什么?
  • 第38讲:如何选择适合自己的阻塞队列?
  • 原子类
  • 第39讲:原子类是如何利用 CAS 保证线程安全的?
  • 第40讲:AtomicInteger 在高并发下性能不好,如何解决?为什么?
  • 第41讲:原子类和 volatile 有什么异同?
  • 第42讲:AtomicInteger 和 synchronized 的异同点?
  • TheadLocal
  • 第44讲:ThreadLocal 适合用在哪些实际生产的场景中?
  • 第45讲:ThreadLocal 是用来解决共享资源的多线程访问的问题吗?
  • 第46讲:多个 ThreadLocal 在 Thread 中的 threadlocals 里是怎么存储的?
  • 第47讲:内存泄漏——为何每次用完 ThreadLocal 都要调用 remove()?
  • Future 掌控未来
  • 第48讲:Callable 和 Runnable 的不同?
  • 第49讲:Future 的主要功能是什么?
  • 第50讲:使用 Future 有哪些注意点?Future 产生新的线程了吗?
  • 线程协作
  • 第52讲:信号量能被 FixedThreadPool 替代吗?
  • 第53讲:CountDownLatch 是如何安排线程执行顺序的?
  • 第54讲:CyclicBarrier 和 CountdownLatch 有什么异同?
  • 第55讲:Condition、object.wait() 和 notify() 的关系?
  • Java 内存模型
  • 第56讲:讲一讲什么是 Java 内存模型?
  • 第57讲:什么是指令重排序?为什么要重排序?
  • 第58讲:Java 中的原子操作有哪些注意事项?
  • 第59讲:什么是“内存可见性”问题?
  • 第60讲:主内存和工作内存的关系?
  • 第61讲:什么是 happens-before 规则?
  • 第62讲:volatile 的作用是什么?与 synchronized 有什么异同?
  • 第63讲:单例模式的双重检查锁模式为什么必须加 volatile?
  • CAS 原理
  • 第64讲:你知道什么是 CAS 吗?
  • 第65讲:CAS 和乐观锁的关系,什么时候会用到 CAS?
  • 第66讲:CAS 有什么缺点?
  • 死锁问题
  • 第67讲:如何写一个必然死锁的例子?
  • 第68讲:发生死锁必须满足哪 4 个条件?
  • 第69讲:如何用命令行和代码定位死锁?
  • 第70讲:有哪些解决死锁问题的策略?
  • 第71讲:讲一讲经典的哲学家就餐问题
  • final 关键字和“不变性”
  • 第72讲:final 的三种用法是什么?
  • 第73讲:为什么加了 final 却依然无法拥有“不变性”?
  • 第74讲:为什么 String 被设计为是不可变的?
  • AQS 框架
  • 第75讲:为什么需要 AQS?AQS 的作用和重要性是什么?
  • 第76讲:AQS 的内部原理是什么样的?
  • 第77讲:AQS 在 CountDownLatch 等类中的应用原理是什么?
  • 总结
  • 第78讲:一份独家的 Java 并发工具图谱