封面图
目录
- 前言
- 第1章Java多线程技能1
- 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.3currentThread()方法16
- 1.4isAlive()方法18
- 1.5sleep()方法20
- 1.6getId()方法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.1suspend与resume方法的使用36
- 1.8.2suspend与resume方法的缺点——独占38
- 1.8.3suspend与resume方法的缺点——不同步40
- 1.9yield方法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章对象及变量的并发访问52
- 2.1synchronized同步方法52
- 2.1.1方法内的变量为线程安全53
- 2.1.2实例变量非线程安全54
- 2.1.3多个对象多个锁57
- 2.1.4synchronized方法与锁对象59
- 2.1.5脏读63
- 2.1.6synchronized锁重入65
- 2.1.7出现异常,锁自动释放68
- 2.1.8同步不具有继承性69
- 2.2synchronized同步语句块71
- 2.2.1synchronized方法的弊端72
- 2.2.2synchronized同步代码块的使用74
- 2.2.3用同步代码块解决同步方法的弊端76
- 2.2.4一半异步,一半同步76
- 2.2.5synchronized代码块间的同步性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.3volatile关键字118
- 2.3.1关键字volatile与死循环118
- 2.3.2解决同步死循环119
- 2.3.3解决异步死循环120
- 2.3.4volatile非原子的特性124
- 2.3.5使用原子类进行i++操作126
- 2.3.6原子类也并不完全安全127
- 2.3.7synchronized代码块有volatile同步的功能130
- 2.4本章总结132
- 第3章线程间通信133
- 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的使用200
- 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(long timeout,TimeUnit unit)的测试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章定时器Timer241
- 5.1定时器Timer的使用241
- 5.1.1方法schedule(TimerTask task, Date time)的测试241
- 5.1.2方法schedule(TimerTask task, Date firstTime, long period)的测试247
- 5.1.3方法schedule(TimerTask task, long delay)的测试252
- 5.1.4方法schedule(TimerTask task, long delay, long period)的测试253
- 5.1.5方法scheduleAtFixedRate(TimerTask task, Date firstTime, long period)的测试254
- 5.2本章总结261
- 第6章单例模式与多线程262
- 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章拾遗增补279
- 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.4SimpleDateFormat非线程安全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