当前位置:当前位置:主页 > 计算机电子书 > Java > Java程序设计 pdf电子书
实战Java高并发程序设计(第3版)

实战Java高并发程序设计(第3版) PDF 完整超清版

  • 更新:2022-09-08
  • 大小:18.8 MB
  • 类别:Java程序设计
  • 作者:葛一鸣
  • 出版:电子工业出版社
  • 格式:PDF

  • 资源介绍
  • 学习心得
  • 相关内容

实战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

资源获取

相关资源

网友留言