{"id":19538821,"url":"https://github.com/guanpengchn/java-concurrent-programming","last_synced_at":"2025-07-29T03:06:52.854Z","repository":{"id":91228348,"uuid":"140992840","full_name":"guanpengchn/java-concurrent-programming","owner":"guanpengchn","description":":notebook: 《实战Java 高并发程序设计》笔记和源码整理","archived":false,"fork":false,"pushed_at":"2019-11-12T02:08:25.000Z","size":183,"stargazers_count":207,"open_issues_count":1,"forks_count":84,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-12T23:06:35.301Z","etag":null,"topics":["concurrency","java","thread"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/guanpengchn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-07-15T02:35:55.000Z","updated_at":"2025-03-25T08:49:23.000Z","dependencies_parsed_at":null,"dependency_job_id":"a70edfb0-ba31-4d1b-855e-fd2709823c7d","html_url":"https://github.com/guanpengchn/java-concurrent-programming","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/guanpengchn/java-concurrent-programming","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanpengchn%2Fjava-concurrent-programming","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanpengchn%2Fjava-concurrent-programming/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanpengchn%2Fjava-concurrent-programming/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanpengchn%2Fjava-concurrent-programming/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/guanpengchn","download_url":"https://codeload.github.com/guanpengchn/java-concurrent-programming/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guanpengchn%2Fjava-concurrent-programming/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267621584,"owners_count":24116900,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-29T02:00:12.549Z","response_time":2574,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["concurrency","java","thread"],"created_at":"2024-11-11T02:36:58.977Z","updated_at":"2025-07-29T03:06:52.833Z","avatar_url":"https://github.com/guanpengchn.png","language":"Java","readme":"# 《实战Java高并发程序设计》笔记和源码\n\n## 笔记\n\n- 《实战Java高并发程序设计》中有很多代码范例，适合初学者通过实践入门并发编程，这本书有个问题就是前面的代码都用JDK7，第六章开始又用JDK8了\n- 笔者做了相关笔记并整理源代码，欢迎交流和 [Star](https://github.com/guanpengchn/java-concurrent-programming)\n- 由于除了jdk外，需要引入第三方包，故而使用maven来进行包管理，建议运行代码前安装好maven环境\n- 笔记在 [notes](https://github.com/guanpengchn/java-concurrent-programming/blob/master/notes)，源代码在 [src/main/java](https://github.com/guanpengchn/java-concurrent-programming/blob/master/src/main/java)\n- 如有需要电子书，可去我的repo中访问[awesome-books](https://github.com/guanpengchn/awesome-books)仓库下载\n- part-部，chapter-章，section-节，paragraph/fragment/segment-完整的一段，passage-篇\n- 笔记中使用的JDK源代码[仓库](https://github.com/guanpengchn/JDK)，fork于[zxiaofan的JDK仓库](https://github.com/zxiaofan/JDK)\n- [彻底删除git中的大文件](https://www.jianshu.com/p/780161d32c8e)\n\n## 书籍概况\n\n- 作者: 葛一鸣 / 郭超\n- 出版社: 电子工业出版社\n- 出版年: 2015-11\n- 页数: 352\n- 定价: 69.00元\n- ISBN: 9787121273049\n\n## 目录\n\n- 第1章　走入并行世界\t1\n\n    - 1.1　何去何从的并行计算 1\n    \n        - 1.1.1　忘掉那该死的并行\t2\n        - 1.1.2　可怕的现实：摩尔定律的失效\t4\n        - 1.1.3　柳暗花明：不断地前进\t5\n        - 1.1.4　光明或是黑暗\t6\n        \n    - 1.2　你必须知道的几个概念\t6\n    \n        - 1.2.1　同步（Synchronous）和异步（Asynchronous）\t7\n        - 1.2.2　并发（Concurrency）和并行（Parallelism）\t8\n        - 1.2.3　临界区\t9\n        - 1.2.4　阻塞（Blocking）和非阻塞（Non-Blocking）\t9\n        - 1.2.5　死锁（Deadlock）、饥饿（Starvation）和活锁（Livelock）\t9\n        \n    - 1.3　并发级别\t11\n    \n        - 1.3.1　阻塞（Blocking）\t11\n        - 1.3.2　无饥饿（Starvation-Free）\t11\n        - 1.3.3　无障碍（Obstruction-Free）\t12\n        - 1.3.4　无锁（Lock-Free）\t12\n        - 1.3.5　无等待（Wait-Free）\t13\n        \n    - 1.4　有关并行的两个重要定律\t13\n    \n        - 1.4.1　Amdahl定律\t13\n        - 1.4.2　Gustafson定律\t16\n        - 1.4.3　Amdahl定律和Gustafson定律是否相互矛盾\t16\n        \n    - 1.5　回到Java：JMM\t17\n    \n        - 1.5.1　原子性（Atomicity）\t18\n        - 1.5.2　可见性（Visibility）\t20\n        - 1.5.3　有序性（Ordering）\t22\n        - 1.5.4　哪些指令不能重排：Happen-Before规则\t27\n        \n    - 1.6　参考文献\t27\n    \n- 第2章　Java并行程序基础\t29\n\n    - 2.1　有关线程你必须知道的事\t29\n    - 2.2　初始线程：线程的基本操作\t32\n    \n        - 2.2.1　新建线程\t32\n        - 2.2.2　终止线程\t34\n        - 2.2.3　线程中断\t38\n        - 2.2.4　等待（wait）和通知（notify）\t41\n        - 2.2.5　挂起（suspend）和继续执行（resume）线程\t44\n        - 2.2.6　等待线程结束（join）和谦让（yield）\t48\n        \n    - 2.3　volatile与Java内存模型（JMM）\t50\n    - 2.4　分门别类的管理：线程组\t52\n    - 2.5　驻守后台：守护线程（Daemon）\t54\n    - 2.6　先干重要的事：线程优先级\t55\n    - 2.7　线程安全的概念与synchronized\t57\n    - 2.8　程序中的幽灵：隐蔽的错误\t61\n    \n        - 2.8.1　无提示的错误案例\t61\n        - 2.8.2　并发下的ArrayList\t62\n        - 2.8.3　并发下诡异的HashMap\t63\n        - 2.8.4　初学者常见问题：错误的加锁\t66\n        \n    - 2.9　参考文献\t68\n    \n- 第3章　JDK并发包\t70\n\n    - 3.1　多线程的团队协作：同步控制\t70\n    \n        - 3.1.1　synchronized的功能扩展：重入锁\t71\n        - 3.1.2　重入锁的好搭档：Condition条件\t80\n        - 3.1.3　允许多个线程同时访问：信号量（Semaphore）\t83\n        - 3.1.4　ReadWriteLock读写锁\t85\n        - 3.1.5　倒计时器：CountDownLatch\t87\n        - 3.1.6　循环栅栏：CyclicBarrier\t89\n        - 3.1.7　线程阻塞工具类：LockSupport\t92\n        \n    - 3.2　线程复用：线程池\t95\n    \n        - 3.2.1　什么是线程池\t96\n        - 3.2.2　不要重复发明轮子：JDK对线程池的支持\t97\n        - 3.2.3　刨根究底：核心线程池的内部实现\t102\n        - 3.2.4　超负载了怎么办：拒绝策略\t106\n        - 3.2.5　自定义线程创建：ThreadFactory\t109\n        - 3.2.6　我的应用我做主：扩展线程池\t110\n        - 3.2.7　合理的选择：优化线程池线程数量\t112\n        - 3.2.8　堆栈去哪里了：在线程池中寻找堆栈\t113\n        - 3.2.9　分而治之：Fork/Join框架\t117\n        \n    - 3.3　不要重复发明轮子：JDK的并发容器\t121\n    \n        - 3.3.1　超好用的工具类：并发集合简介\t121\n        - 3.3.2　线程安全的HashMap\t122\n        - 3.3.3　有关List的线程安全\t123\n        - 3.3.4　高效读写的队列：深度剖析ConcurrentLinkedQueue\t123\n        - 3.3.5　高效读取：不变模式下的CopyOnWriteArrayList\t129\n        - 3.3.6　数据共享通道：BlockingQueue\t130\n        - 3.3.7　随机数据结构：跳表（SkipList）\t134\n        \n    - 3.4　参考资料\t136\n    \n- 第4章　锁的优化及注意事项\t138\n\n    - 4.1　有助于提高“锁”性能的几点建议\t139\n    \n        - 4.1.1　减小锁持有时间\t139\n        - 4.1.2　减小锁粒度\t140\n        - 4.1.3　读写分离锁来替换独占锁\t142\n        - 4.1.4　锁分离\t142\n        - 4.1.5　锁粗化\t144\n        \n    - 4.2　Java虚拟机对锁优化所做的努力\t146\n    \n        - 4.2.1　锁偏向\t146\n        - 4.2.2　轻量级锁\t146\n        - 4.2.3　自旋锁\t146\n        - 4.2.4　锁消除\t146\n        \n    - 4.3　人手一支笔：ThreadLocal\t147\n    \n        - 4.3.1　ThreadLocal的简单使用\t148\n        - 4.3.2　ThreadLocal的实现原理\t149\n        - 4.3.3　对性能有何帮助\t155\n        \n    - 4.4　无锁\t157\n    \n        - 4.4.1　与众不同的并发策略：比较交换（CAS）\t158\n        - 4.4.2　无锁的线程安全整数：AtomicInteger\t159\n        - 4.4.3　Java中的指针：Unsafe类\t161\n        - 4.4.4　无锁的对象引用：AtomicReference\t162\n        - 4.4.5　带有时间戳的对象引用：AtomicStampedReference\t165\n        - 4.4.6　数组也能无锁：AtomicIntegerArray\t168\n        - 4.4.7　让普通变量也享受原子操作：AtomicIntegerFieldUpdater\t169\n        - 4.4.8　挑战无锁算法：无锁的Vector实现\t171\n        - 4.4.9　让线程之间互相帮助：细看SynchronousQueue的实现\t176\n        \n    - 4.5　有关死锁的问题\t179\n    - 4.6　参考文献\t183\n    \n- 第5章　并行模式与算法\t184\n\n    - 5.1　探讨单例模式\t184\n    - 5.2　不变模式\t187\n    - 5.3　生产者-消费者模式\t190\n    - 5.4　高性能的生产者-消费者：无锁的实现\t194\n    \n        - 5.4.1　无锁的缓存框架：Disruptor\t195\n        - 5.4.2　用Disruptor实现生产者-消费者案例\t196\n        - 5.4.3　提高消费者的响应时间：选择合适的策略\t199\n        - 5.4.4　CPU Cache的优化：解决伪共享问题\t200\n        \n    - 5.5　Future模式\t204\n    \n        - 5.5.1　Future模式的主要角色\t206\n        - 5.5.2　Future模式的简单实现\t207\n        - 5.5.3　JDK中的Future模式\t210\n        \n    - 5.6　并行流水线\t212\n    - 5.7　并行搜索\t216\n    - 5.8　并行排序\t218\n    \n        - 5.8.1　分离数据相关性：奇偶交换排序\t218\n        - 5.8.2　改进的插入排序：希尔排序\t221\n        \n    - 5.9　并行算法：矩阵乘法\t226\n    - 5.10　准备好了再通知我：网络NIO\t230\n    \n        - 5.10.1　基于Socket的服务端的多线程模式\t230\n        - 5.10.2　使用NIO进行网络编程\t235\n        - 5.10.3　使用NIO来实现客户端\t243\n        \n    - 5.11　读完了再通知我：AIO\t245\n    \n        - 5.11.1　AIO EchoServer的实现\t245\n        - 5.11.2　AIO Echo客户端实现\t248\n        \n    - 5.12　参考文献\t249\n    \n- 第6章　Java 8与并发\t251\n\n    - 6.1　Java 8的函数式编程简介\t251\n    \n        - 6.1.1　函数作为一等公民\t252\n        - 6.1.2　无副作用\t252\n        - 6.1.3　申明式的（Declarative）\t253\n        - 6.1.4　不变的对象\t254\n        - 6.1.5　易于并行\t254\n        - 6.1.6　更少的代码\t254\n        \n    - 6.2　函数式编程基础\t255\n    \n        - 6.2.1　FunctionalInterface注释\t255\n        - 6.2.2　接口默认方法\t256\n        - 6.2.3　lambda表达式\t259\n        - 6.2.4　方法引用\t260\n        \n    - 6.3　一步一步走入函数式编程\t263\n    - 6.4　并行流与并行排序\t267\n    \n        - 6.4.1　使用并行流过滤数据\t267\n        - 6.4.2　从集合得到并行流\t268\n        - 6.4.3　并行排序\t268\n        \n    - 6.5　增强的Future：CompletableFuture\t269\n    \n        - 6.5.1　完成了就通知我\t269\n        - 6.5.2　异步执行任务\t270\n        - 6.5.3　流式调用\t272\n        - 6.5.4　CompletableFuture中的异常处理\t272\n        - 6.5.5　组合多个CompletableFuture\t273\n        \n    - 6.6　读写锁的改进：StampedLock\t274\n    \n        - 6.6.1　StampedLock使用示例\t275\n        - 6.6.2　StampedLock的小陷阱\t276\n        - 6.6.3　有关StampedLock的实现思想\t278\n        \n    - 6.7　原子类的增强\t281\n    \n        - 6.7.1　更快的原子类：LongAdder\t281\n        - 6.7.2　LongAdder的功能增强版：LongAccumulator\t287\n        \n    - 6.8　参考文献\t288\n    \n- 第7章　使用Akka构建高并发程序\t289\n\n    - 7.1　新并发模型：Actor\t290\n    - 7.2　Akka之Hello World\t290\n    - 7.3　有关消息投递的一些说明\t293\n    - 7.4　Actor的生命周期\t295\n    - 7.5　监督策略\t298\n    - 7.6　选择Actor\t303\n    - 7.7　消息收件箱（Inbox）\t303\n    - 7.8　消息路由\t305\n    - 7.9　Actor的内置状态转换\t308\n    - 7.10　询问模式：Actor中的Future\t311\n    - 7.11　多个Actor同时修改数据：Agent\t313\n    - 7.12　像数据库一样操作内存数据：软件事务内存\t316\n    - 7.13　一个有趣的例子：并发粒子群的实现\t319\n    \n        - 7.13.1　什么是粒子群算法\t320\n        - 7.13.2　粒子群算法的计算过程\t320\n        - 7.13.3　粒子群算法能做什么\t322\n        - 7.13.4　使用Akka实现粒子群\t323\n        \n    - 7.14　参考文献\t330\n    \n- 第8章　并行程序调试\t331\n\n    - 8.1　准备实验样本\t331\n    - 8.2　正式起航\t332\n    - 8.3　挂起整个虚拟机\t334\n    - 8.4　调试进入ArrayList内部\t336\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguanpengchn%2Fjava-concurrent-programming","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguanpengchn%2Fjava-concurrent-programming","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguanpengchn%2Fjava-concurrent-programming/lists"}