《实战Java高并发程序设计(第3版)》是由电子工业出版社出版的一本关于Java程序设计方面的书籍,作者是葛一鸣,主要介绍了关于Java、高并发、程序设计方面的知识内容,目前在Java程序设计类书籍综合评分为:7.1分。
书籍介绍
编辑推荐
逻辑顺畅。全书脉络清晰,从Java高并发程序的设计基础开始由底层原理落实到具体案例,环环相扣,完整流畅。
结构严谨。总体上循序渐进,逐步提升。每一章都各自有鲜明的侧重点,有利于读者快速抓住重点。
实用性强。本书注重实战,采用了理论结合实践的编写方法,给重要的知识点都安排了代码实例,帮助读者在工作中实战应用。
通俗易懂。相较于抽象的理论堆叠,本书采用简单的白话文叙述风格,搭配上手工绘制的配图,行文流畅,简洁明了,降低了阅读门槛和理解难度,争取让读者在阅读过程中少盲点、无盲点。
内容简介
本书主要介绍基于Java的并行程序设计基础、思路、方法和实战。首先,立足于并发程序基础,详细介绍Java中进行并行程序设计的基本方法。其次,进一步详细介绍了JDK中对并行程序的强大支持,帮助读者可以快速、稳健地进行并行程序开发。再次,详细讨论了有关"锁”的优化和提高并行程序性能级别的方法和思路。第四,介绍了并行的基本设计模式以及Java 8、9、10对并行程序的支持和改进。第五,介绍了高并发框架Akka的使用方法。第六,详细介绍了并行程序的调试方法。最后分析Jetty代码并给出一些其在高并发优化方面的举例。《实战java高并发程序设计》第1~2版得到了读者的认可,而今Java 版本一直在变化,新的技术也有迭代,本书更要与时俱进,进行一些深层技术的更新,如GC一些优化方式等等。
目录
- 第1章走入并行世界 1
- 1.1何去何从的并行计算 1
- 1.1.1忘掉那该死的并行 2
- 1.1.2可怕的现实:摩尔定律的失效 4
- 1.1.3柳暗花明:不断地前进 5
- 1.1.4光明或是黑暗 6
- 1.2你必须知道的几个概念 7
- 1.2.1同步(Synchronous)和异步(Asynchronous) 7
- 1.2.2并发(Concurrency)和并行(Parallelism) 8
- 1.2.3临界区 9
- 1.2.4阻塞(Blocking)和非阻塞(Non-Blocking) 9
- 1.2.5死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock) 10
- 1.3并发级别 11
- 1.3.1阻塞 11
- 1.3.2无饥饿(Starvation-Free) 11
- 1.3.3无障碍(Obstruction-Free) 12
- 1.3.4无锁(Lock-Free) 13
- 1.3.5无等待(Wait-Free) 13
- 1.4有关并行的两个重要定律 14
- 1.4.1Amdahl定律 14
- 1.4.2Gustafson定律 16
- 1.4.3是否相互矛盾 17
- 1.5回到Java:JMM 18
- 1.5.1原子性(Atomicity) 18
- 1.5.2可见性(Visibility) 20
- 1.5.3有序性(Ordering) 22
- 1.5.4哪些指令不能重排:Happen-Before规则 27
- 第2章Java并行程序基础 29
- 2.1有关线程你必须知道的事 29
- 2.2初始线程:线程的基本操作 32
- 2.2.1新建线程 32
- 2.2.2终止线程 34
- 2.2.3线程中断 38
- 2.2.4等待(wait)和通知(notify) 41
- 2.2.5挂起(suspend)和继续执行(resume)线程 45
- 2.2.6等待线程结束(join)和谦让(yield) 48
- 2.3volatile与Java内存模型(JMM) 50
- 2.4分门别类的管理:线程组 53
- 2.5驻守后台:守护线程(Daemon) 54
- 2.6先做重要的事:线程优先级 55
- 2.7线程安全的概念与关键字synchronized 57
- 2.8程序中的幽灵:隐蔽的错误 61
- 2.8.1无提示的错误案例 61
- 2.8.2并发下的ArrayList 62
- 2.8.3并发下诡异的HashMap 64
- 2.8.4初学者常见的问题:错误的加锁 66
- 第3章JDK并发包 69
- 3.1多线程的团队协作:同步控制 69
- 3.1.1超越synchronized的同步工具:重入锁 70
- 3.1.2重入锁的好搭档:Condition 79
- 3.1.3允许多个线程同时访问:信号量(Semaphore) 83
- 3.1.4ReadWriteLock读写锁 85
- 3.1.5倒计数器:CountDownLatch 88
- 3.1.6循环栅栏:CyclicBarrier 89
- 3.1.7线程阻塞工具类:LockSupport 93
- 3.1.8深入理解锁:AbstractQueuedSynchronizer 96
- 3.1.9 Guava和RateLimiter限流 105
- 3.2线程复用:线程池 108
- 3.2.1什么是线程池 109
- 3.2.2不要重复发明轮子:JDK对线程池的支持 110
- 3.2.3刨根究底:核心线程池的内部实现 116
- 3.2.4超负载了怎么办:拒绝策略 120
- 3.2.5自定义线程创建:ThreadFactory 122
- 3.2.6我的应用我做主:扩展线程池 123
- 3.2.7合理的选择:优化线程池线程数量 126
- 3.2.8堆栈去哪里了:在线程池中寻找堆栈 127
- 3.2.9分而治之:Fork/Join框架 131
- 3.2.10Guava中对线程池的扩展 135
- 3.3不要重复发明轮子:JDK的并发容器 137
- 3.3.1超好用的工具类:并发集合简介 137
- 3.3.2线程安全的HashMap 138
- 3.3.3深入浅出ConcurrentHashMap 139
- 3.3.4有关List的线程安全 145
- 3.3.5高效读写的队列:深度剖析ConcurrentLinkedQueue类 145
- 3.3.6高效读取:不变模式下的CopyOnWriteArrayList类 151
- 3.3.7数据共享通道:BlockingQueue 152
- 3.3.8随机数据结构:跳表(SkipList) 157
- 3.4使用JMH进行性能测试 159
- 3.4.1什么是JMH 160
- 3.4.2Hello JMH 160
- 3.4.3JMH的基本概念和配置 163
- 3.4.4理解JMH中的Mode 164
- 3.4.5理解JMH中的State 166
- 3.4.6有关性能的一些思考 166
- 3.4.7CopyOnWriteArrayList类与ConcurrentLinkedQueue类 169
- 第4章锁的优化及注意事项 172
- 4.1有助于提高锁性能的几点建议 173
- 4.1.1减少锁持有时间 173
- 4.1.2减小锁粒度 174
- 4.1.3用读写分离锁来替换独占锁 175
- 4.1.4锁分离 175
- 4.1.5锁粗化 178
- 4.2Java虚拟机对锁优化所做的努力 179
- 4.2.1锁偏向 179
- 4.2.2轻量级锁 180
- 4.2.3自旋锁 180
- 4.2.4锁消除 180
- 4.3人手一支笔:ThreadLocal 181
- 4.3.1ThreadLocal的简单使用 181
- 4.3.2ThreadLocal的实现原理 183
- 4.3.3对性能有何帮助 189
- 4.3.4线程私有的随机数发生器ThreadLocalRandom 192
- 4.4无锁 197
- 4.4.1与众不同的并发策略:比较交换 197
- 4.4.2无锁的线程安全整数:AtomicInteger 198
- 4.4.3Java中的指针:Unsafe类 200
- 4.4.4无锁的对象引用:AtomicReference 202
- 4.4.5带有时间戳的对象引用:AtomicStampedReference 205
- 4.4.6数组也能无锁:AtomicIntegerArray 208
- 4.4.7让普通变量也享受原子操作:AtomicIntegerFieldUpdater 209
- 4.4.8挑战无锁算法:无锁的Vector实现 211
- 4.4.9让线程之间互相帮助:细看SynchronousQueue的实现 216
- 4.5有关死锁的问题 220
- 第5章并行模式与算法 224
- 5.1探讨单例模式 224
- 5.2不变模式 228
- 5.3生产者-消费者模式 230
- 5.4高性能的生产者-消费者模式:无锁的实现 235
- 5.4.1无锁的缓存框架:Disruptor 235
- 5.4.2用Disruptor框架实现生产者-消费者模式的案例 236
- 5.4.3提高消费者的响应时间:选择合适的策略 240
- 5.4.4CPU Cache的优化:解决伪共享问题 241
- 5.5Future模式 244
- 5.5.1Future模式的主要参与者 247
- 5.5.2Future模式的简单实现 247
- 5.5.3JDK中的Future模式 250
- 5.5.4Guava对Future模式的支持 252
- 5.6并行流水线 254
- 5.7并行搜索 258
- 5.8并行排序 260
- 5.8.1分离数据相关性:奇偶交换排序 260
- 5.8.2改进的插入排序:希尔排序 264
- 5.9并行算法:矩阵乘法 268
- 5.10准备好了再通知我:网络NIO 272
- 5.10.1基于Socket的服务端多线程模式 273
- 5.10.2使用NIO进行网络编程 278
- 5.10.3使用NIO实现客户端 286
- 5.11读完了再通知我:AIO 288
- 5.11.1AIO EchoServer的实现 288
- 5.11.2AIO客户端的实现 291
- 第6章Java 8/9/10与并发 294
- 6.1Java 8的函数式编程简介 294
- 6.1.1函数作为一等公民 295
- 6.1.2无副作用 296
- 6.1.3声明式的编程方式 296
- 6.1.4不变的对象 297
- 6.1.5易于并行 297
- 6.1.6更少的代码 297
- 6.2函数式编程基础 298
- 6.2.1FunctionalInterface注释 298
- 6.2.2接口默认方法 299
- 6.2.3lambda表达式 303
- 6.2.4方法引用 304
- 6.3一步一步走入函数式编程 306
- 6.4并行流与并行排序 311
- 6.4.1使用并行流过滤数据 311
- 6.4.2从集合得到并行流 312
- 6.4.3并行排序 312
- 6.5增强的Future:CompletableFuture 313
- 6.5.1完成了就通知我 313
- 6.5.2异步执行任务 314
- 6.5.3流式调用 316
- 6.5.4CompletableFuture中的异常处理 316
- 6.5.5组合多个CompletableFuture 317
- 6.5.6支持timeout的CompletableFuture 319
- 6.6读写锁的改进:StampedLock 319
- 6.6.1StampedLock的使用示例 320
- 6.6.2StampedLock的小陷阱 321
- 6.6.3有关StampedLock的实现思想 323
- 6.7原子类的增强 326
- 6.7.1更快的原子类:LongAdder 327
- 6.7.2LongAdder功能的增强版:LongAccumulator 334
- 6.8ConcurrentHashMap的增强 335
- 6.8.1forEach操作 335
- 6.8.2reduce操作 335
- 6.8.3条件插入 336
- 6.8.4search操作 337
- 6.8.5其他新方法 338
- 6.9发布订阅模式 338
- 6.9.1 简单的发布订阅模式案例 340
- 6.9.2 数据处理链 342
- 第7章使用Akka构建高并发程序 344
- 7.1新并发模型:Actor 345
- 7.2Akka之Hello World 345
- 7.3有关消息投递的一些说明 348
- 7.4Actor的生命周期 350
- 7.5监督策略 354
- 7.6选择Actor 359
- 7.7消息收件箱(Inbox) 359
- 7.8消息路由 361
- 7.9Actor的内置状态转换 364
- 7.10询问模式:Actor中的Future 367
- 7.11多个Actor同时修改数据:Agent 369
- 7.12像数据库一样操作内存数据:软件事务内存 372
- 7.13一个有趣的例子:并发粒子群的实现 376
- 7.13.1什么是粒子群算法 377
- 7.13.2粒子群算法的计算过程 377
- 7.13.3粒子群算法能做什么 378
- 7.13.4使用Akka实现粒子群算法 379
- 第8章并行程序调试 388
- 8.1准备实验样本 388
- 8.2正式起航 389
- 8.3挂起整个虚拟机 392
- 8.4调试进入ArrayList内部 393
- 第9章多线程优化示例——Jetty核心代码分析 397
- 9.1Jetty简介与架构 397
- 9.2Jetty服务器初始化 399
- 9.2.1初始化线程池 399
- 9.2.2初始化ScheduledExecutorScheduler 401
- 9.2.3初始化ByteBufferPool 402
- 9.2.4维护ConnectionFactory 405
- 9.2.5计算ServerConnector的线程数量 406
- 9.3启动Jetty服务器 406
- 9.3.1设置启动状态 406
- 9.3.2注册ShutdownMonitor 407
- 9.3.3计算系统的线程数量 407
- 9.3.4启动QueuedThreadPool 408
- 9.3.5启动Connector 408
- 9.4处理HTTP请求 411
- 9.4.1Accept成功 411
- 9.4.2请求处理 413