第十一章 并发
线程允许多个活动并发进行。并发编程比单线程编程更困难,容易出错的地方更多,而且失败很难重现。你无法避开并发。它是平台中固有的,并且多核处理器现在也是无处不在,而你会有从多核处理器获得良好的性能的需求。本章包含一些建议,帮助你编写清晰、正确、文档良好的并发程序。
78. 同步访问共享的可变数据
关键字 synchronized 可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块。许多程序员把同步的概念仅仅理解为一种互斥( mutual exclusion )的方式...
79. 避免过度同步
第 78 条告诫过我们缺少同步的危险性。本条目则关注相反的问题。依据情况的不同,过度同步则可能导致性能降低、死锁,甚至不确定的行为。 为了避免活性失败和安全性失败,在一个被同步的方法或者...
80. executor 、task 和 stream 优先于线程
本书第 1 版中阐述了简单的工作队列(work queue)[Bloch01 ,详见第 49 条]代码。它利用一个后台线程,允许客户端可以插入异步处理任务到队列中。当不再需要这个工作队列时,...
81. 并发工具优于 wait 和 notify
本书第 1 版中专门用了一个条目来说明如何正确地使用 wait 和 notify ( Bloch01,详见第 50 条) 。它提出的建议仍然有效,并且在本条目的最后也对此做了概述,但是这条建...
82. 文档应包含线程安全属性
类在其方法并发使用时的行为是其与客户端约定的重要组成部分。如果你没有记录类在这一方面的行为,那么它的用户将被迫做出假设。如果这些假设是错误的,生成的程序可能缺少足够的同步(详见 78 条)或...
83. 明智审慎的使用延迟初始化
延迟初始化是延迟字段的初始化,直到需要它的值。如果不需要该值,则不会初始化字段。这种技术既适用于静态字段,也适用于实例字段。虽然延迟初始化主要是一种优化,但是它也可以用于破坏类中的有害循环和...
84. 不要依赖线程调度器
当许多线程可以运行时,线程调度器决定哪些线程可以运行以及运行多长时间。任何合理的操作系统都会尝试公平地做出这个决定,但是策略可能会有所不同。因此,编写良好的程序不应该依赖于此策略的细节。任何...