Java多线程编程核心技术PDF

网站

更多书籍点击进入>> CiCi岛

下载

电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍

  • 电子书下载(皮皮云盘-点击“普通下载”)
  • 购买正版

封页

Java多线程编程核心技术PDF_第1张图片

内容简介

全书共7章。第1章讲解了Java多线程的基础,重点介绍线程类的核心API的使用。第2章讲解对并发访问的控制,即如何写出线程安全的程序。第3章介绍线程间通信,以提高CPU利用率和系统间的交互,同时增强对线程任务的把控与监督。第4章讲解Lock对象,以更好实现并发访问时的同步处理。第5章讲解移动开发中使用较多的定时器类的多线程技术,这是计划/任务执行里很重要的技术点。第6章讲解如何安全、正确地将单例模式与多线程技术相结合,避免实际应用中可能会出现的麻烦。第7章将前面被遗漏的案例在本章节中进行补充,尽量做到不出现技术空白点。

目 录

目 录?Contents

前 言

第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.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章 对象及变量的并发访问 52

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 内置类与同步:实验1 111

2.2.15 内置类与同步:实验2 113

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章 线程间通信 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()与null 191

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实现同步:测试1 200

4.1.2 使用ReentrantLock实现同步:测试2 202

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章 定时器Timer 241

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和TERMINATED 280

7.1.2 验证TIMED_WAITING 281

7.1.3 验证BLOCKED 282

7.1.4 验证WAITING 284

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 解决异常方法1 294

7.4.3 解决异常方法2 295

7.5 线程中出现异常的处理 297

7.6 线程组内处理异常 299

7.7 线程异常处理的传递 301

7.8 本章总结 306

前 言

Preface?前 言为什么要写这本书早在几年前笔者就曾想过整理一份与Java多线程有关的稿件,因为市面上所有的Java书籍都是以一章或两章的篇幅介绍多线程技术,并没有完整地覆盖该技术的知识点,但可惜,苦于当时的时间及精力有限,一直没有达成所愿。

也许是注定的安排,我目前所在的单位是集技术与教育为一体的软件类企业。我在工作中发现很多学员在学习完JavaSE/JavaEE之后想对更深入的技术进行探索,比如在对大数据、分布式、高并发类的专题进行攻克时,立即遇到针对java.lang包中Thread类的学习,但Thread类的学习并不像JDBC那样简单,学习多线程会遇到太多的问题、弯路以及我们所谓的“坑”,为了带领学员在技术层面上进行更高的追求,我将多线程的技术点以教案的方式进行整理,在课堂上与同学们一起学习、交流,同学们反响也非常热烈。此至,若干年前的心愿终于了却,学员们也很期待这本书能出版发行,因为这样他们就有了真正的纸质参考资料,其他爱好Java多线程的朋友们也在期盼本书的出版。本书能促进他们相互交流与学习,这就是我最大的心愿。

本书秉承大道至简的主导思想,只介绍Java多线程开发中最值得关注的内容,希望能抛砖引玉,以个人的一些想法和见解,为读者拓展出更深入、更全面的思路。

本书特色在本书写作的过程中,我尽量减少“啰嗦”的文字语言,全部用案例来讲解技术点的实现,使读者看到代码及运行结果后就可以知道此项目要解决的是什么问题,类似于网络中的博客风格,可让读者用最短的时间学完相关知识点,明白这些知识点是如何应用的,以及在使用时要避免什么。本书就像“瑞士军刀”一样,精短小,但却非常锋利,可帮读者快速学习知识并解决问题。

读者对象本书适合所有Java程序员阅读,尤其适合以下读者:

Java多线程开发者Java并发开发者系统架构师大数据开发者其他对多线程技术感兴趣的人员如何阅读本书在整理本书时,我一直本着实用、易懂的原则,最终整理出7章:

第1章讲解了Java多线程的基础,包括Thread类的核心API的使用。

第2章讲解了在多线程中对并发访问的控制,主要就是synchronized的使用,由于此关键字在使用上非常灵活,所以书中用了很多案例来介绍此关键字的使用,为读者学习同步相关内容打好坚实的基础。

第3章介绍线程并不是孤独的,它们之间要通信,要交互。本章主要介绍wait()、notifyAll()和notify()方法的使用,使线程间能互相通信,合作完成任务。本章还介绍了ThreadLocal类的使用。学习完本章,读者就能在Thread多线程中进行数据的传递了。

第4章讲解了synchronized关键字,它使用起来比较麻烦,所以在Java 5中提供了Lock对象,以求能更好地实现并发访问时的同步处理,包括读写锁等相关技术点。

第5章讲解了Timer定时器类,其内部实现就是使用的多线程技术。定时器的计划任务执行是很重要的技术点,包括在Android开发时都会有深入的使用,所以会为读者详细讲解。

第6章讲解的单例模式虽然很简单,但如果遇到多线程将会变得非常麻烦,如何在多线程中解决这么棘手的问题呢?本章将全面介绍解决方案。

第7章,在整理稿件的过程中肯定会出现一些技术知识点的空缺,前面被遗漏的技术案例将在本章进行补充,以帮助读者形成完整的多线程的知识体系。编写本章的目的就是尽量使本书不存在技术空白点。

勘误和支持由于我的水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正,让我与大家一起,在技术之路上互勉共进。我的邮箱是279377921@qq.com,期待能够得到你们的真挚反馈。本书的源代码可以在华章网站(www.hzbook.com)下载。

致谢感谢所在单位领导的支持与厚爱,使我在技术道路上更有信心。

感谢机械工业出版社华章公司的高婧雅和杨福川,因为有了你们的鼓励、帮助和引导,我才能顺利完成本书。

高洪岩

你可能感兴趣的:(Java多线程编程核心技术PDF)