人人都是程序员
| 微信公众号 gorhaf

多线程

01|认识多线程
02|创建线程的三种方式
03|获取当前正在执行任务的线程
04|获取和设置线程的名称
05|run 方法与 start 方法的区别
06|获取和设置线程优先级
07|使当前正在执行的线程进入休眠状态
08|优雅地停止线程
09|让线程放弃执行权
10|等待线程死亡 join 方法
11|后台线程 Daemon 的作用
12|如何得知线程执行完 isAlive
13|线程组 ThreadGroup
14|synchronized 关键字
15|同步锁的类型有哪些
16|同一把锁
17|死锁是如何产生的
18|等待唤醒机制 wait、notify
19|wait 与 sleep的区别
20|线程间通讯 wait、notify 应用
21|显式锁 Lock 的使用
22|非阻塞式获取锁
23|中断等待锁的线程 lockInterruptibly
24|Lock锁的等待唤醒机制 Condition
25|生产者与消费者 Condition应用
26|可重入锁与不可重入锁
27|公平锁与非公平锁
28|读锁与写锁 ReentrantReadWriteLock
29|读写锁实战高并发容器
30|synchronized 与 Lock的区别
31|等待唤醒工具类 LockSupport
32|LockSupport 实战互斥锁
33|读写锁互斥的情况
34|读写锁升级版 StampedLock
35|StampedLock 可重入性
36|线程状态及生命周期
37|面试必问 ThreadLocal
38|线程间如何共享 ThreadLocal
39|线程池之间如何共享 ThreadLocal
40|什么是内存可见性?volatile 怎么用?
41|什么是原子性?i++是原子操作吗?
42|什么是比较并交换 CAS 技术?
43|这 12 个原子类里最常用的是这两个
44|CAS 算法有问题,什么是 ABA 问题?

线程池

01|什么是线程池?为什么要使用线程池?
02|为什么推荐使用原生方式创建线程池?
03|这三种创建线程池的方式有风险,慎用!
04|execute 与 submit 的区别
05|阻塞式和定时式哪种获取任务的方式更好?
06|取消任务的 cancel 方法的一些困惑
07|四个任务拒绝策略该用哪一个?
08|关闭线程池 shutdown 方法
09|shutdown 与 shutdownNow 的区别
10|线程池状态及生命周期
11|线程池是怎样执行任务的?
12|如何执行批量任务?
13|如何执行定时、延时任务?
14|如何执行周期、重复性任务?
15|什么是 ForkJoin框架?
16|如何使用 ForkJoinPool?
17|如何使用 CompletionService?
18|如何监控线程池?

同步器

01|如何使用同步器 CountDownLatch?
02|如何使用 CountDownLatch 实现并行计算?
03|如何使用同步器 CyclicBarrier?
04|如何使用交换器 Exchanger?
05|如何使用信号量 Semaphore?
06|如何使用阶段同步器 Phaser

集合

01|为什么要使用集合?
02|向集合中添加单个或批量数据
03|集合是如何删除数据的?
04|集合批量删除数据的四种方法
05|ArrayList 特点及优缺点
06|LinkedList 特点及优缺点
07|HashMap 特点及优缺点
08|LinkedHashMap 特点及优缺点
09|TreeMap 特点及优缺点
10|HashSet 特点及优缺点
11|LinkedHashSet 特点及优缺点
12|TreeSet 特点及优缺点
13|fail-fast 快速失败机制
14|ConcurrentHashMap 特点及优缺点
15|为什么 ConcurrentHashMap 只给头节点加锁?

IO

01|创建、删除、重命名文件目录
02|字符是如何存储在电脑上的
03|字节输入流 InputStream
04|read 方法读的是字节为什么返回 int
05|数据读完以后为什么要关闭流?
06|如何更高效的读取字节
07|字节输出流 OutputStream
08|覆盖与追加
09|复制文件
10|如何正确创建未知文件
11|字符编码
12|中文是如何存储在电脑上的(UTF-8)
13|以字符为单位读取数据
14|字符输入流 Reader
15|以字符为单位写入数据
16|字符输出流 Writer
17|复制文本文件一行代码搞定
18|LineNumberReader:以行为单位读取数据
19|缓冲流:读写效率最高的流
20|转换流:将字节流转换为字符流
21|打印流 PrintStream、PrintWriter
22|Java是如何处理键盘输入的
23|序列化与反序列化
24|transient 关键字

NIO

01|什么是路径(Path)
02|一行代码搞定读数据
03|一行代码搞定写数据
04|文件打开选项StandardOpenOption
05|什么是稀疏文件(Sparse File)
06|什么是元数据
07|如无必要,不要使用实时同步
08|什么是缓冲区Buffer
09|Buffer 的基本用法
10|如何在缓冲区中打标记(Mark)
11|翻转(flip)缓冲区是什么意思
12|缓冲区里的数据第二次读是空的?
13|什么是压缩(compact)缓冲区
14|什么是通道 Channel
15|创建 FileChannel 的两种方式
16|如何使用 FileChannel 读数据
17|如何使用 FileChannel 写数据
18|如何使用 FileChannel 复制文件
19|什么是 ServerSocketChannel
20|什么是 SocketChannel
21|什么是 Selector
22|如何创建 Selector
23|如何将 Channel 注册到 Selector?
24|Channel 如何监听多个事件?
25|Channel 是如何感知事件的?

未完待续