一、目录介绍
第1章 Java多线程技能
1.1 进程和多线程的概念及线程的优点1
1.2 使用多线程3
1.2.1 继承Thread类4
1.2.2 实现Runnable接口8
1.2.3 实例变量与线程安全9
1.2.4 留意i——与System.out.println()的异常14
1.3 currentThread()方法16
1.4 isAlive()方法18
1.5 sleep()方法20
1.6 getId()方法22
1.7 停止线程23
1.7.1 停止不了的线程23
1.7.2 判断线程是否是停止状态24
1.7.3 能停止的线程——异常法27
1.7.4 在沉睡中停止30
1.7.5 能停止的线程——暴力停止32
1.7.6 方法stop()与java.lang.ThreadDeath异常33
1.7.7 释放锁的不良后果34
1.7.8 使用return停止线程35
1.8 暂停线程36
1.8.1 suspend与resume方法的使用36
1.8.2 suspend与resume方法的缺点——独占38
1.8.3 suspend与resume方法的缺点——不同步40
1.9 yield方法42
1.10 线程的优先级43
1.10.1 线程优先级的继承特性43
1.10.2 优先级具有规则性44
1.10.3 优先级具有随机性47
1.10.4 看谁运行得快49
1.11 守护线程50
1.12 本章小结51
第2章 对象及变量的并发访问
2.1 synchronized同步方法52
2.1.1 方法内的变量为线程安全53
2.1.2 实例变量非线程安全54
2.1.3 多个对象多个锁57
2.1.4 synchronized方法与锁对象59
2.1.5 脏读63
2.1.6 synchronized锁重入65
2.1.7 出现异常,锁自动释放68
2.1.8 同步不具有继承性69
2.2 synchronized同步语句块71
2.2.1 synchronized方法的弊端72
2.2.2 synchronized同步代码块的使用74
2.2.3 用同步代码块解决同步方法的弊端76
2.2.4 一半异步,一半同步76
2.2.5 synchronized代码块间的同步性78
2.2.6 验证同步synchronized(this)代码块是锁定当前对象的80
2.2.7 将任意对象作为对象监视器82
2.2.8 细化验证3个结论91
2.2.9 静态同步synchronized方法与synchronized(class)代码块96
2.2.10 数据类型String的常量池特性102
2.2.11 同步synchronized方法无限等待与解决105
2.2.12 多线程的死锁107
2.2.13 内置类与静态内置类109
2.2.14 内置类与同步:实验1111
2.2.15 内置类与同步:实验2113
2.2.16 锁对象的改变114
2.3 volatile关键字118
2.3.1 关键字volatile与死循环118
2.3.2 解决同步死循环119
2.3.3 解决异步死循环120
2.3.4 volatile非原子的特性124
2.3.5 使用原子类进行i++操作126
2.3.6 原子类也并不完全安全127
2.3.7 synchronized代码块有volatile同步的功能130
2.4 本章总结132
第3章 线程间通信
3.1 等待/通知机制133
3.1.1 不使用等待/通知机制实现线程间通信133
3.1.2 什么是等待/通知机制135
3.1.3 等待/通知机制的实现136
3.1.4 方法wait()锁释放与notify()锁不释放143
3.1.5 当interrupt方法遇到wait方法146
3.1.6 只通知一个线程148
3.1.7 唤醒所有线程150
3.1.8 方法wait(long)的使用150
3.1.9 通知过早152
3.1.10 等待wait的条件发生变化155
3.1.11 生产者/消费者模式实现158
3.1.12 通过管道进行线程间通信:字节流171
3.1.13 通过管道进行线程间通信:字符流174
3.1.14 实战:等待/通知之交叉备份177
3.2 方法join的使用179
3.2.1 学习方法join前的铺垫179
3.2.2 用join()方法来解决180
3.2.3 方法join与异常181
3.2.4 方法join(long)的使用183
3.2.5 方法join(long)与sleep(long)的区别184
3.2.6 方法join()后面的代码提前运行:出现意外187
3.2.7 方法join()后面的代码提前运行:解释意外189
3.3 类ThreadLocal的使用191
3.3.1 方法get()与null191
3.3.2 验证线程变量的隔离性192
3.3.3 解决get()返回null问题195
3.3.4 再次验证线程变量的隔离性195
3.4 类InheritableThreadLocal的使用197
3.4.1 值继承197
3.4.2 值继承再修改198
3.5 本章总结199
第4章 Lock的使用
4.1 使用ReentrantLock类200
4.1.1 使用ReentrantLock实现同步:测试1200
4.1.2 使用ReentrantLock实现同步:测试2202
4.1.3 使用Condition实现等待/通知错误用法与解决204
4.1.4 正确使用Condition实现等待/通知207
4.1.5 使用多个Condition实现通知部分线程:错误用法208
4.1.6 使用多个Condition实现通知部分线程:正确用法210
4.1.7 实现生产者/消费者模式:一对一交替打印213
4.1.8 实现生产者/消费者模式:多对多交替打印214
4.1.9 公平锁与非公平锁216
4.1.10 方法getHoldCount()、getQueueLength()和getWaitQueueLength()的测试219
4.1.11 方法hasQueuedThread()、hasQueuedThreads()和hasWaiters()的测试222
4.1.12 方法isFair()、isHeldByCurrentThread()和isLocked()的测试224
4.1.13 方法lockInterruptibly()、tryLock()和tryLock(longtimeout,TimeUnitunit)的测试226
4.1.14 方法awaitUninterruptibly()的使用230
4.1.15 方法awaitUntil()的使用232
4.1.16 使用Condition实现顺序执行234
4.2 使用ReentrantReadWriteLock类236
4.2.1 类ReentrantReadWriteLock的使用:读读共享236
4.2.2 类ReentrantReadWriteLock的使用:写写互斥237
4.2.3 类ReentrantReadWriteLock的使用:读写互斥238
4.2.4 类ReentrantReadWriteLock的使用:写读互斥239
4.3 本章总结240
第5章 定时器Timer
5.1 定时器Timer的使用241
5.1.1 方法schedule(TimerTasktask,Datetime)的测试241
5.1.2 方法schedule(TimerTasktask,DatefirstTime,longperiod)的测试247
5.1.3 方法schedule(TimerTasktask,longdelay)的测试252
5.1.4 方法schedule(TimerTasktask,longdelay,longperiod)的测试253
5.1.5 方法scheduleAtFixedRate(TimerTasktask,DatefirstTime,longperiod)的测试254
5.2 本章总结261
第6章 单例模式与多线程
6.1 立即加载/“饿汉模式”262
6.2 延迟加载/“懒汉模式”263
6.3 使用静态内置类实现单例模式271
6.4 序列化与反序列化的单例模式实现272
6.5 使用static代码块实现单例模式274
6.6 使用enum枚举数据类型实现单例模式275
6.7 完善使用enum枚举实现单例模式277
6.8 本章总结278
第7章 拾遗增补
7.1 线程的状态279
7.1.1 验证NEW、RUNNABLE和TERMINATED280
7.1.2 验证TIMED_WAITING281
7.1.3 验证BLOCKED282
7.1.4 验证WAITING284
7.2 线程组285
7.2.1 线程对象关联线程组:1级关联285
7.2.2 线程对象关联线程组:多级关联287
7.2.3 线程组自动归属特性288
7.2.4 获取根线程组288
7.2.5 线程组里加线程组289
7.2.6 组内的线程批量停止290
7.2.7 递归与非递归取得组内对象290
7.3 使线程具有有序性291
7.4 SimpleDateFormat非线程安全293
7.4.1 出现异常293
7.4.2 解决异常方法1294
7.4.3 解决异常方法2295
7.5 线程中出现异常的处理297
7.6 线程组内处理异常299
7.7 线程异常处理的传递301
7.8 本章总结306