[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fsM4ex5TMpfDDpNrCjrD3HjnfS0nPiMWO0ood8v5hWL0":3,"$f5yoqitIW5ADUuaCedd4PWmXKoB5crwlZmg8BlQfo-no":33,"$fx2iC7ZFuyYuyXEWSKSUJvhTFLVrqQgtkpGcBrFSUVlw":76,"$fXD_XDAG7sf-D_PaS1P1RL76SukFt4j0YaAkqPSKggGU":130},{"ads":4,"bookConfig":31,"enableAds":13,"enableAdsVpn":13,"enableAdsVps":13,"userConfig":32},[5,12,19,25],{"coverImage":6,"description":7,"id":8,"image":9,"link":10,"title":11},"https://cdn.alltool.top/image/detail/fanai_ad.jpg","一顿饭AI 提供 ChatGPT Plus、Claude 等主流 AI 会员服务，支持支付宝直接付款，价格实在，开通简单。",7,"https://alltool.top/image/detail/chatgpt_logo.png","/blog/5a43","ChatGPT Plus低价代充｜支持支付宝",{"coverImage":13,"description":14,"id":15,"image":16,"link":17,"title":18},null,"2核2G内存40G SSD云服务器，3M带宽，1个外网IPv4地址，超高性价比！",1,"https://img.alicdn.com/tfs/TB1_ZXuNcfpK1RjSZFOXXa6nFXa-32-32.ico","https://www.cnblogs.com/haws/p/18582641/aliyun79","阿里云99元/年服务器专享购买链接",{"coverImage":13,"description":20,"id":21,"image":22,"link":23,"title":24},"免费下载电子书阅读器，支持Windows、安卓、IOS、MacOS等系统",5,"https://alltool.top/image/detail/ebook.png","https://pan.xunlei.com/s/VOLZuDZRhtvQUgIxeq96Mu9pA1?pwd=abn7","EPUB、PDF电子书阅读器下载",{"coverImage":13,"description":26,"id":27,"image":28,"link":29,"title":30},"最强PDF工具，支持编辑、签名、加密、OCR识别等25种功能。",3,"https://alltool.top/image/detail/adobe_acrobat.png","https://www.cnblogs.com/haws/p/18686608/adobeAcrobat","Adobe Acrobat Pro 2025绿色版","{\"bookQa\":[{\"question\":\"不知道提取码？\",\"answer\":\"点击下载会自动复制“提取码”，弹窗里也会显示“提取码”\"},{\"question\":\"如何下载？\",\"answer\":\"先将文件夹转存到自己的网盘（一定要转存整个文件夹，否则文件更新不会提醒），然后在网盘下载文件\"},{\"question\":\"不知道下载哪种格式？\",\"answer\":\"移动端阅读推荐EPUB格式；电脑端如果阅读技术书籍，推荐PDF，阅读文学作品推荐EPUB格式。\"},{\"question\":\"个别PDF文档预览一直提示“文档打开失败”\",\"answer\":\"网盘自身问题，下载后可正常阅读。也可先转存到自己的网盘，再用客户端预览。\"},{\"question\":\"每天的下载次数是多少？\",\"answer\":\"每人每天可以下载5本不同的书籍，已经下载过的不占用下载次数。⚠️通过技术手段恶意频繁下载会被封禁！\"}]}","{\"enableResourceRequest\":true,\"enableAds\":true,\"enableAdsVpn\":false,\"enableAdsVps\":false,\"indexTopCount\":15,\"indexTopLatestCount\":15,\"indexStickCount\":10,\"indexLatestCount\":20}",{"author":34,"bookTags":13,"bookVersion":13,"categoryIds":35,"categoryNames":38,"code":41,"coverImageUrl":42,"createTime":43,"description":44,"doubanUrl":45,"files":46,"indexId":54,"isbn":55,"isbn10":56,"language":57,"name":58,"publishDate":59,"publisher":60,"pv":61,"recommendation":13,"score":62,"seoDescription":63,"seoKeywords":64,"seoTitle":65,"series":66,"tags":67,"title":58,"toc":72,"translator":73,"updateTime":74,"updateTimeDesc":75},"[美] Brian Goetz 等",[36,37],140,170,[39,40],"计算机","编程","4b600b2198b042df893df199cdc76923","/image/cover/4b600b2198b042df893df199cdc76923.jpg","2025-01-13 15:24:17","\u003Cp>本书深入浅出地介绍了 Java 线程和并发，是一本完美的 Java 并发参考手册。书中从并发性和线程安全性的基本概念出发，介绍了如何使用类库提供的基本并发构建块，用于避免并发危险、构造线程安全的类及验证线程安全的规则，如何将小的线程安全类组合成更大的线程安全类，如何利用线程来提高并发应用程序的吞吐量，如何识别可并行执行的任务，如何提高单线程子系统的响应性，如何确保并发程序执行预期任务，如何提高并发代码的性能和可伸缩性等内容，最后介绍了一些高级主题，如显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类。\u003C/p>\u003Cp>本书适合 Java 程序开发人员阅读。\u003C/p>","https://book.douban.com/subject/10484692/",[47],{"code":48,"fileFormat":49,"fileSize":50,"needPassword":51,"netDiskType":52,"pages":53,"remark":13},"7b61492433b24cf1ad6c5eea0c49a5df","PDF+EPUB","19.24 MB",true,"Quark",290,"4940664002","9787111370048","711137004X","中文","Java并发编程实战","2012-01-01","机械工业出版社",21,0,"《Java并发编程实战》PDF免费下载，下载地址：https://pan.quark.cn/s/0ab9d60998f6。作者：[美] Brian Goetz 等，ISBN：9787111370048，由机械工业出版社于2012年01月出版。本书深入浅出地介绍了 Java 线程和并发，是一本完美的 J……","Java并发编程实战,机械工业出版社,[美]Brian Goetz，等 童云兰，等,电子书,电子版,pdf,免费下载,下载,epub","《Java并发编程实战》 - PDF下载","华章专业开发者丛书",[68],{"code":13,"color":69,"name":70,"sort":27,"tip":71},"warning","OCR PDF","经过OCR处理的扫描版，文字可复制","[ {\"title\": \"第1章 简介\", \"page\": 1, \"children\": [{\"title\": \"1.1 并发简史\", \"page\": 1}, {\"title\": \"1.2 线程的优势\", \"page\": 2, \"children\": [{\"title\": \"1.2.1 发挥多处理器的强大能力\", \"page\": 2}, {\"title\": \"1.2.2 建模的简单行\", \"page\": 3}, {\"title\": \"1.2.3 异步事件的简化处理\", \"page\": 3}, {\"title\": \"1.2.4 响应更灵敏的用户界面\", \"page\": 4}]}, {\"title\": \"1.3 线程带来的风险\", \"page\": 4, \"children\": [{\"title\": \"1.4 线程无处不在\", \"page\": 7}, {\"title\": \"1.3.1 线程安全问题\", \"page\": 5}, {\"title\": \"1.3.2 活跃性问题\", \"page\": 7}, {\"title\": \"1.3.3 性能问题\", \"page\": 7}]}]}, {\"title\": \"第一部分 基础知识\", \"page\": 11, \"children\": [{\"title\": \"第2章 线程安全行\", \"page\": 11, \"children\": [{\"title\": \"2.1 什么是线程安全性\", \"page\": 13}, {\"title\": \"2.2 原子性\", \"page\": 14, \"children\": [{\"title\": \"2.2.1 竞态条件\", \"page\": 15}, {\"title\": \"2.2.2 示例：延迟初始化中的竞态条件\", \"page\": 16}, {\"title\": \"2.2.3 复合操作\", \"page\": 17}]}, {\"title\": \"2.3 加锁机制\", \"page\": 18, \"children\": [{\"title\": \"2.3.1 内置锁\", \"page\": 20}, {\"title\": \"2.3.2 重入\", \"page\": 21}]}, {\"title\": \"2.4 用锁来保护状态\", \"page\": 22}, {\"title\": \"2.5 活跃性与性能\", \"page\": 23}]}, {\"title\": \"第3章 对象的共享\", \"page\": 27, \"children\": [{\"title\": \"3.1 可见性\", \"page\": 27, \"children\": [{\"title\": \"3.1.1 失效数据\", \"page\": 28}, {\"title\": \"3.1.2 非原子的64位操作\", \"page\": 29}, {\"title\": \"3.1.3 加锁与可见性\", \"page\": 30}, {\"title\": \"3.1.4 Volatile 变量\", \"page\": 30}]}, {\"title\": \"3.2 发布与逸出\", \"page\": 32}, {\"title\": \"3.3 线程封闭\", \"page\": 35, \"children\": [{\"title\": \"3.3.1 Ad-hoc 线程封闭\", \"page\": 35}, {\"title\": \"3.3.2 栈封闭\", \"page\": 36}, {\"title\": \"3.3.3 ThreadLocal类\", \"page\": 37}]}, {\"title\": \"3.4 不变性\", \"page\": 38, \"children\": [{\"title\": \"3.4.1 Final 域\", \"page\": 39}, {\"title\": \"3.4.2 示例：使用 Volatile 类型来发布不可变对象\", \"page\": 40}]}, {\"title\": \"3.5 安全发布\", \"page\": 41, \"children\": [{\"title\": \"3.5.1 不正确的发布：正确的对象被破坏\", \"page\": 42}, {\"title\": \"3.5.2 不可变对象与初始化安全性\", \"page\": 42}, {\"title\": \"3.5.3 安全发布的常用模式\", \"page\": 43}, {\"title\": \"3.5.4 事实不可变对象\", \"page\": 44}, {\"title\": \"3.5.5 可变对象\", \"page\": 44}, {\"title\": \"3.5.6 安全地共享对象\", \"page\": 44}]}]}, {\"title\": \"第4章 对象的组合\", \"page\": 46, \"children\": [{\"title\": \"4.1 设计线程安全的类\", \"page\": 46, \"children\": [{\"title\": \"4.1.1 收集同步需求\", \"page\": 47}, {\"title\": \"4.1.2 依赖状态的操作\", \"page\": 48}, {\"title\": \"4.1.3 状态的所有权\", \"page\": 48}]}, {\"title\": \"4.2 实例封闭\", \"page\": 49, \"children\": [{\"title\": \"4.2.1 Java 监视器模式\", \"page\": 51}, {\"title\": \"4.2.2 示例：车辆追踪\", \"page\": 51}]}, {\"title\": \"4.3 线程安全性的委托\", \"page\": 53, \"children\": [{\"title\": \"4.3.1 示例：基于委托的车辆追踪器\", \"page\": 54}, {\"title\": \"4.3.2 独立的状态变量\", \"page\": 55}, {\"title\": \"4.3.3 当委托失效时\", \"page\": 56}, {\"title\": \"4.3.4 发布底层的状态变量\", \"page\": 57}, {\"title\": \"4.3.5 示例：发布状态的车辆追踪器\", \"page\": 58}]}, {\"title\": \"4.4 在现有的线程安全类中添加功能\", \"page\": 59, \"children\": [{\"title\": \"4.4.1 客户端加锁机制\", \"page\": 60}, {\"title\": \"4.4.2 组合\", \"page\": 62}]}, {\"title\": \"4.5 将同步策略文档化\", \"page\": 62}]}, {\"title\": \"第5章 基础构建模块\", \"page\": 66, \"children\": [{\"title\": \"5.1 同步容器类\", \"page\": 66, \"children\": [{\"title\": \"5.1.1 同步容器类的问题\", \"page\": 66}, {\"title\": \"5.1.2 迭代器与 ConcurrentModificationException\", \"page\": 68}, {\"title\": \"5.1.3 隐藏迭代器\", \"page\": 69}]}, {\"title\": \"5.2 并发容器\", \"page\": 70, \"children\": [{\"title\": \"5.2.1 ConcurrentHashMap\", \"page\": 71}, {\"title\": \"5.2.2 额外的原子 Map 操作\", \"page\": 72}, {\"title\": \"5.2.3 CopyOnWriteArrayList\", \"page\": 72}]}, {\"title\": \"5.3 阻塞队列和生产者一消费者模式\", \"page\": 73, \"children\": [{\"title\": \"5.3.1 示例：桌面搜索\", \"page\": 75}, {\"title\": \"5.3.2 串行线程封闭\", \"page\": 76}, {\"title\": \"5.3.3 双端队列与工作密取\", \"page\": 77}]}, {\"title\": \"5.4 阻塞方法与中断方法\", \"page\": 77}, {\"title\": \"5.5 同步工具类\", \"page\": 78, \"children\": [{\"title\": \"5.5.1 闭锁\", \"page\": 79}, {\"title\": \"5.5.2 FutureTask\", \"page\": 80}, {\"title\": \"5.5.3 信号量\", \"page\": 82}, {\"title\": \"5.5.4 栅栏\", \"page\": 83}]}, {\"title\": \"5.6 构建高效且可伸缩的结果缓存\", \"page\": 85}]}, {\"title\": \"第一部分小结\", \"page\": 90}]}, {\"title\": \"第二部分 结构化并发应用程序\", \"page\": 93, \"children\": [{\"title\": \"第6章 任务执行\", \"page\": 93, \"children\": [{\"title\": \"6.1 在线程中执行任务\", \"page\": 93, \"children\": [{\"title\": \"6.1.1 串行地执行任务\", \"page\": 94}, {\"title\": \"6.1.2 显式地为任务创建线程\", \"page\": 94}, {\"title\": \"6.1.3 无限制创建线程的不足\", \"page\": 95}]}, {\"title\": \"6.2 Executor 框架\", \"page\": 96, \"children\": [{\"title\": \"6.2.1 示例：基于 Executor 的 Web服务器\", \"page\": 97}, {\"title\": \"6.2.2 执行策略\", \"page\": 98}, {\"title\": \"6.2.3 线程池\", \"page\": 98}, {\"title\": \"6.2.4 Executor 的生命周期\", \"page\": 99}, {\"title\": \"6.2.5. 延迟任务与周期任务\", \"page\": 101}]}, {\"title\": \"6.3 找出可利用的并行性\", \"page\": 102, \"children\": [{\"title\": \"6.3.1 示例：串行的页面渲染器\", \"page\": 102}, {\"title\": \"6.3.2 携带结果的任务Callable 与 Future\", \"page\": 103}, {\"title\": \"6.3.3 示例：使用 Future 实现页面渲染器\", \"page\": 104}, {\"title\": \"6.3.4 在异构任务并行化中存在的局限\", \"page\": 106}, {\"title\": \"6.3.5 CompletionService:Executor 与 BlockingQueue\", \"page\": 106}, {\"title\": \"6.3.6 示例：使用 CompletionService 实现页面渲染器\", \"page\": 107}, {\"title\": \"6.3.7 为任务设置时限\", \"page\": 108}, {\"title\": \"6.3.8 示例：旅行预定门户网站\", \"page\": 109}, {\"title\": \"小结\", \"page\": 110}]}]}, {\"title\": \"第7章 取消与关闭\", \"page\": 111, \"children\": [{\"title\": \"7.1 任务取消\", \"page\": 111, \"children\": [{\"title\": \"7.1.1 中断\", \"page\": 113}, {\"title\": \"7.1.2 中断策略\", \"page\": 116}, {\"title\": \"7.1.3 响应中断\", \"page\": 117}, {\"title\": \"7.1.4 示例：计时运行\", \"page\": 118}, {\"title\": \"7.1.5 通过 Future 来实现取消\", \"page\": 120}, {\"title\": \"7.1.6 处理不可中断的阻塞\", \"page\": 121}, {\"title\": \"7.1.7 采用 newTaskFor 来封装非标准的取消\", \"page\": 122}]}, {\"title\": \"7.2 停止基于线程的服务\", \"page\": 124, \"children\": [{\"title\": \"7.2.1 示例：日志服务\", \"page\": 124}, {\"title\": \"7.2.2 关闭 ExecutorService\", \"page\": 127}, {\"title\": \"7.2.3 “毒丸”对象\", \"page\": 128}, {\"title\": \"7.2.4 示例：只执行一次的服务\", \"page\": 129}, {\"title\": \"7.2.5 shutdownNow 的局限性\", \"page\": 130}]}, {\"title\": \"7.3 处理非正常的线程终止\", \"page\": 132}, {\"title\": \"7.4 JVM关闭\", \"page\": 135, \"children\": [{\"title\": \"7.4.1 关闭钩子\", \"page\": 135}, {\"title\": \"7.4.2 守护线程\", \"page\": 136}, {\"title\": \"7.4.3 终结器\", \"page\": 136}]}, {\"title\": \"小结\", \"page\": 137}]}, {\"title\": \"第8章 线程池的使用\", \"page\": 138, \"children\": [{\"title\": \"8.1 在任务与执行策略之间的隐性耦合\", \"page\": 138, \"children\": [{\"title\": \"8.1.1 线程饥饿死锁\", \"page\": 139}, {\"title\": \"8.1.2 运行时间较长的任务\", \"page\": 140}]}, {\"title\": \"8.2 设置线程池的大小\", \"page\": 140}, {\"title\": \"8.3 配置ThreadPoolExecutor\", \"page\": 141, \"children\": [{\"title\": \"8.3.1 线程的创建与销毁\", \"page\": 142}, {\"title\": \"8.3.2 管理队列任务\", \"page\": 142}, {\"title\": \"8.3.3 饱和策略\", \"page\": 144}, {\"title\": \"8.3.4 线程工厂\", \"page\": 146}, {\"title\": \"8.3.5 在调用构造函数后再定制 ThreadPoolExecutor\", \"page\": 147}]}, {\"title\": \"8.4 扩展 ThreadPoolExecutor\", \"page\": 148}, {\"title\": \"8.5 递归算法的并行化\", \"page\": 149}, {\"title\": \"小结\", \"page\": 155}]}, {\"title\": \"第9章 图形用户界面应用程序\", \"page\": 156, \"children\": [{\"title\": \"9.1 为什么 GUI是单线程的\", \"page\": 156, \"children\": [{\"title\": \"9.1.1 串行事件处理\", \"page\": 157}, {\"title\": \"9.1.2 Swing 中的线程封闭机制\", \"page\": 158}]}, {\"title\": \"9.2 短时间的 GUI 任务\", \"page\": 160}, {\"title\": \"9.3 长时间的GUI 任务\", \"page\": 161, \"children\": [{\"title\": \"9.3.1 取消\", \"page\": 162}, {\"title\": \"9.3.2 进度标识和完成标识\", \"page\": 163}, {\"title\": \"9.3.3 SwingWorker\", \"page\": 165}]}, {\"title\": \"9.4 共享数据模型\", \"page\": 165, \"children\": [{\"title\": \"9.4.1 线程安全的数据模型\", \"page\": 166}, {\"title\": \"9.4.2 分解数据模型\", \"page\": 166}]}, {\"title\": \"9.5 其他形式的单线程子系统\", \"page\": 167}, {\"title\": \"小结\", \"page\": 167}]}]}, {\"title\": \"第三部分 活跃性、性能与测试\", \"page\": 169, \"children\": [{\"title\": \"第10章 避免活跃性危险\", \"page\": 169, \"children\": [{\"title\": \"10.1 死锁\", \"page\": 169, \"children\": [{\"title\": \"10.1.1 锁顺序死锁\", \"page\": 170}, {\"title\": \"10.1.2 动态的锁顺序死锁\", \"page\": 171}, {\"title\": \"10.1.3 在协作对象之间发生的死锁\", \"page\": 174}, {\"title\": \"10.1.4 开放调用\", \"page\": 175}, {\"title\": \"10.1.5 资源死锁\", \"page\": 177}]}, {\"title\": \"10.2 死锁的避免与诊断\", \"page\": 178, \"children\": [{\"title\": \"10.2.1 支持定时的锁\", \"page\": 178}, {\"title\": \"10.2.2 通过线程转储信息来分析死锁\", \"page\": 178}]}, {\"title\": \"10.3 其他活跃性危险\", \"page\": 180, \"children\": [{\"title\": \"10.3.1 饥饿\", \"page\": 180}, {\"title\": \"10.3.2 糟糕的响应性\", \"page\": 181}, {\"title\": \"10.3.3 活锁\", \"page\": 181}]}, {\"title\": \"小结\", \"page\": 182}]}, {\"title\": \"第11章 性能与可伸缩性\", \"page\": 183, \"children\": [{\"title\": \"11.1 对性能的思考\", \"page\": 183, \"children\": [{\"title\": \"11.1.1 性能与可伸缩性\", \"page\": 184}, {\"title\": \"11.1.2 评估各种性能权衡因素\", \"page\": 185}]}, {\"title\": \"11.2 Amdahl 定律\", \"page\": 186, \"children\": [{\"title\": \"11.2.1 示例：在各种框架中隐藏的串行部分\", \"page\": 188}, {\"title\": \"11.2.2 Amdahl定律的应用\", \"page\": 189}]}, {\"title\": \"11.3 线程引入的开销\", \"page\": 189, \"children\": [{\"title\": \"11.3.1 上下文切换\", \"page\": 190}, {\"title\": \"11.3.2 内存同步\", \"page\": 190}, {\"title\": \"11.3.3 阻塞\", \"page\": 192}]}, {\"title\": \"11.4 减少锁的竞争\", \"page\": 192, \"children\": [{\"title\": \"11.4.1 缩小锁的范围（“快进快出”）\", \"page\": 193}, {\"title\": \"11.4.2 減小锁的粒度\", \"page\": 195}, {\"title\": \"11.4.3 锁分段\", \"page\": 196}, {\"title\": \"11.4.4 避免热点域\", \"page\": 197}, {\"title\": \"11.4.5 一些替代独占锁的方法\", \"page\": 198}, {\"title\": \"11.4.6 监测CPU 的利用率\", \"page\": 199}, {\"title\": \"11.4.7 向对象池说“不”\", \"page\": 200}]}, {\"title\": \"11.5 示例：比较 Map 的性能\", \"page\": 200}, {\"title\": \"11.6 减少上下文切换的开销\", \"page\": 201}, {\"title\": \"小结\", \"page\": 203}]}, {\"title\": \"第12章 并发程序的测试\", \"page\": 204, \"children\": [{\"title\": \"12.1 正确性测试\", \"page\": 205, \"children\": [{\"title\": \"12.1.1 基本的单元测试\", \"page\": 206}, {\"title\": \"12.1.2 对阻塞操作的测试\", \"page\": 207}, {\"title\": \"12.1.3 安全性测试\", \"page\": 208}, {\"title\": \"12.1.4 资源管理的测试\", \"page\": 212}, {\"title\": \"12.1.5 使用回调\", \"page\": 213}, {\"title\": \"12.1.6 产生更多的交替操作\", \"page\": 214}]}, {\"title\": \"12.2 性能测试\", \"page\": 215, \"children\": [{\"title\": \"12.2.1 在 PutTakeTest 中增加计时功能\", \"page\": 215}, {\"title\": \"12.2.2 多种算法的比较\", \"page\": 217}, {\"title\": \"12.2.3 响应性衡量\", \"page\": 218}]}, {\"title\": \"12.3 避免性能测试的陷阱\", \"page\": 220, \"children\": [{\"title\": \"12.3.1 垃圾回收\", \"page\": 220}, {\"title\": \"12.3.2 动态编译\", \"page\": 220}, {\"title\": \"12.3.3 对代码路径的不真实采样\", \"page\": 222}, {\"title\": \"12.3.4 不真实的竞争程度\", \"page\": 222}, {\"title\": \"12.3.5 无用代码的消除\", \"page\": 223}]}, {\"title\": \"12.4 其他的测试方法\", \"page\": 224, \"children\": [{\"title\": \"12.4.1 代码审查\", \"page\": 224}, {\"title\": \"12.4.2 静态分析工具\", \"page\": 224}, {\"title\": \"12.4.3 面向方面的测试技术\", \"page\": 226}, {\"title\": \"12.4.4 分析与监测工具\", \"page\": 226}, {\"title\": \"小结\", \"page\": 226}]}]}]}, {\"title\": \"第四部分 高级主题\", \"page\": 227, \"children\": [{\"title\": \"第13章 显式锁\", \"page\": 227, \"children\": [{\"title\": \"13.1 Lock 与 ReentrantLock\", \"page\": 227, \"children\": [{\"title\": \"13.1.1 轮询锁与定时锁\", \"page\": 228}, {\"title\": \"13.1.2 可中断的锁获取操作\", \"page\": 230}, {\"title\": \"13.1.3 非块结构的加锁\", \"page\": 231}]}, {\"title\": \"13.2 性能考虑因素\", \"page\": 231}, {\"title\": \"13.3 公平性\", \"page\": 232}, {\"title\": \"13.4 在 synchronized 和 ReentrantLock 之间进行选择\", \"page\": 234}, {\"title\": \"13.5 读一写锁\", \"page\": 235}, {\"title\": \"小结\", \"page\": 237}]}, {\"title\": \"第14章 构建自定义的同步工具\", \"page\": 238, \"children\": [{\"title\": \"14.1 状态依赖性的管理\", \"page\": 238, \"children\": [{\"title\": \"14.1.1 示例：将前提条件的失败传递给调用者\", \"page\": 240}, {\"title\": \"14.1.2 示例：通过轮询与休眠来实现简单的阻塞\", \"page\": 241}, {\"title\": \"14.1.3 条件队列\", \"page\": 243}]}, {\"title\": \"14.2 使用条件队列\", \"page\": 244, \"children\": [{\"title\": \"14.2.1 条件谓词\", \"page\": 244}, {\"title\": \"14.2.2 过早唤醒\", \"page\": 245}, {\"title\": \"14.2.3 丟失的信号\", \"page\": 246}, {\"title\": \"14.2.4 通知\", \"page\": 247}, {\"title\": \"14.2.5 示例：阀门类\", \"page\": 248}, {\"title\": \"14.2.6 子类的安全问题\", \"page\": 249}, {\"title\": \"14.2.7 封装条件队列\", \"page\": 250}, {\"title\": \"14.2.8 入口协议与出口协议\", \"page\": 250}]}, {\"title\": \"14.3 显式的 Condition 对象\", \"page\": 251}, {\"title\": \"14.4 •Synchronizer 剖析\", \"page\": 253}, {\"title\": \"14.5 AbstractQueuedSynchronizer\", \"page\": 254}, {\"title\": \"14.6 java.util.concurrent 同步器类中的AQS\", \"page\": 257, \"children\": [{\"title\": \"14.6.1 ReentrantLock\", \"page\": 257}, {\"title\": \"14.6.2 Semaphore 与 CountDownLatch\", \"page\": 258}, {\"title\": \"14.6.3 FutureTask\", \"page\": 259}, {\"title\": \"14.6.4 ReentrantReadWriteLock\", \"page\": 259}]}, {\"title\": \"小结\", \"page\": 260}]}, {\"title\": \"第15章 原子变量与非阻塞同步机制\", \"page\": 261, \"children\": [{\"title\": \"15.1 锁的劣势\", \"page\": 261}, {\"title\": \"15.2 硬件对并发的支持\", \"page\": 262, \"children\": [{\"title\": \"15.2.1 比较并交换\", \"page\": 263}, {\"title\": \"15.2.2 非阻塞的计数器\", \"page\": 264}, {\"title\": \"15.2.3 JVM对 CAS的支持\", \"page\": 265}]}, {\"title\": \"15.3 原子变量类\", \"page\": 265, \"children\": [{\"title\": \"15.3.1 原子变量是一种“更好的 volatile”\", \"page\": 266}, {\"title\": \"15.3.2 性能比较：锁与原子变量\", \"page\": 267}]}, {\"title\": \"15.4 非阻塞算法\", \"page\": 270, \"children\": [{\"title\": \"15.4.1 非阻塞的栈\", \"page\": 270}, {\"title\": \"15.4.2 非阻塞的链表\", \"page\": 272}, {\"title\": \"15.4.3 原子的域更新器\", \"page\": 274}, {\"title\": \"15.4.4 ABA 问题\", \"page\": 275}]}, {\"title\": \"小结\", \"page\": 276}]}, {\"title\": \"第16章 Java内存模型\", \"page\": 277, \"children\": [{\"title\": \"16.1 什么是内存模型，为什么需要它\", \"page\": 277, \"children\": [{\"title\": \"16.1.1 平台的内存模型\", \"page\": 278}, {\"title\": \"16.1.2 重排序\", \"page\": 278}, {\"title\": \"16.1.3 Java 内存模型简介\", \"page\": 280}, {\"title\": \"16.1.4 借助同步\", \"page\": 281}]}, {\"title\": \"16.2 发布\", \"page\": 283, \"children\": [{\"title\": \"16.2.1 不安全的发布\", \"page\": 283}, {\"title\": \"16.2.2 安全的发布\", \"page\": 284}, {\"title\": \"16.2.3 安全初始化模式\", \"page\": 284}, {\"title\": \"16.2.4 双重检查加锁\", \"page\": 286}]}, {\"title\": \"16.3 初始化过程中的安全性\", \"page\": 287}, {\"title\": \"小结\", \"page\": 288}]}]}, {\"title\": \"附录A 并发性标注\", \"page\": 289, \"children\": [{\"title\": \"A.1 类的标注\", \"page\": 289}, {\"title\": \"A.2 域和方法的标注\", \"page\": 289}]}, {\"title\": \"参考文献\", \"page\": 291}]","童云兰","2026-08-19 12:16:01","29天前",[77,86,95,104,112,121],{"author":78,"categories":79,"code":80,"coverImageUrl":81,"description":13,"name":82,"publishDate":83,"pv":84,"score":85},"尼恩",[39,40],"7a1996ee28dc446196e1533cc4017e9c","/image/cover/7a1996ee28dc446196e1533cc4017e9c.jpg","Java高并发核心编程 卷2 : 多线程、锁、JMM、JUC、高并发设计模式","2021-04-01 00:00:00",25,7.6,{"author":87,"categories":88,"code":89,"coverImageUrl":90,"description":13,"name":91,"publishDate":92,"pv":93,"score":94},"诺曼·毛瑞尔（Norman Maurer）/马文·艾伦·沃尔夫泰尔（Marvin Allen Wolfthal）",[39,40],"1c9ef0af93874caf9d551c456bc6272d","/image/cover/1c9ef0af93874caf9d551c456bc6272d.jpg","Netty实战：Netty In Action","2015-01-01 00:00:00",33,10,{"author":96,"categories":97,"code":98,"coverImageUrl":99,"description":13,"name":100,"publishDate":101,"pv":102,"score":103},"许式伟",[39,40],"3g8kd","/image/cover/3g8kd.jpg","Go语言编程","2012-08-01 00:00:00",13,7.1,{"author":105,"categories":106,"code":107,"coverImageUrl":108,"description":13,"name":109,"publishDate":110,"pv":111,"score":94},"方腾飞",[39,40],"5e55c88cd3474d6f94134a59f163f0ae","/image/cover/5e55c88cd3474d6f94134a59f163f0ae.png","Java并发编程的艺术","2015-07-01 00:00:00",85,{"author":113,"categories":114,"code":115,"coverImageUrl":116,"description":13,"name":117,"publishDate":118,"pv":119,"score":120},"高洪岩",[39,40],"agzxx","/image/cover/agzxx.jpg","Java并发编程：核心方法与框架","2016-05-01 00:00:00",9,4,{"author":122,"categories":123,"code":125,"coverImageUrl":126,"description":13,"name":127,"publishDate":128,"pv":8,"score":129},"[美] Doug Lea",[39,124],"计算机科学","6hoe6","/image/cover/6hoe6.jpg","Java并发编程：设计原则与模式（第二版）","2004-02-01 00:00:00",8.6,[]]