- p.6: In Figure 1.1, nextValue should be getNext.
- p.6: In the first paragraph, nextValue++ should be value++.
- p.7: In the second paragraph, nextValue should be getNext.
- p.7: In Listing 1.2, nextValue should be value (to be consistent with Listing 1.1).
- p.34: In the last sentence, the reference to done should be to ready.
- p.53: "when shared a Date" should "when sharing a Date".
- p.62: In the last paragraph before section 4.3, "getLocation" should be "getLocations".
- p.68: The last word of the first paragraph should be "variables", not "varaibles".
- p.69: In Listing 4.11, the two-arg constructor body should be simply "this.set(x, y)".
- p.74: In Listing 4.16, "if (contains)" should be "if (!contains)". The entire example would
be better expressed using a local variable "absent", as in the previous two listings.
- p.74: In the call-out at the bottom of the page, "synchronization" is missing an "r".
- p.81: In Figure 5.1, the threads are mislabeled: A and B should be exchanged.
- p.84: In the first paragraph, "collections are arguments" should be "collections as arguments".
- p.89: In the last line, "DiskCrawler" should be "FileCrawler".
- p.121: In the last paragraph,
"Tasks submitted to an ExecutorService after it has been shut down are
handled by the rejected execution handler (see Section 8.3.3)" is too general.
Rejected execution handling is provided specifically by ThreadPoolExecutor, an
implementation of ExecutorService, not by ExecutorService itself.
- p.130: In Listing 6.15, info is superfluously marked final.
- p.148: In Asynchronous I/O with Selector, it is the close method that causes
select to return prematurely by throwing ClosedSelectedException,
not the wakeup method.
- p.153: In the second paragraph, "satifying" should be "satisfying".
- p.154: In Listing 7.15, the last two synchronized (this) lines should read
- p.172: In footnote 3, "core size of zero" should be "non-zero core size".
- p.179: In the first sentence of Section 8.4, terminate should be terminated.
- p.197: In Listing 9.6, the first instance of runningTask != null should be
runningTask == null.
- p.197: In Listing 9.6, Thread.currentThread().isInterrupted() should be
- p.200: In Listing 9.8, the argument to backgroundExec.execute should be
listener.task rather than just task, and the first and last lines
of the listing should be deleted.
- p.214: In Listing 10.6, Taxi.setLocation should not be a synchronized method.
(The synchronized block in its body is correct, however.)
- p.239: Section 11.4.5, second paragraph, fourth line: "excusively" should be "exclusively".
- p.259: In Listing 12.9, the call to newFixedThreadPool should have another argument, "threadFactory".
- p.265: last paragraph, 1st sentence: "fair semaphores provides" should be "fair semaphores provide".
- p.269: 2nd paragraph, 2nd sentence: "the" is repeated in "If the the work..."
- p.280: In Listing 13.3, the relational operator in the 5th line from the bottom should
be >= (greater-than-or-equals), not < (less-than).
- p.292: In Listing 14.1, should have release lock after perform action.
- p.301: In the fifth bullet item in the middle of the page, "the the" should be "the".
- p.307: In the first paragraph, "Both of these factors make it impossible to enforce the
uniform waiter requirement for using notifyAll", it should be notify, not
- p.340: In Figure 16.1, y=b should be x=b in Thread A, and x=a
should be y=a in Thread B.
- p.345: The reference in the second paragraph to "Figure 16.3" should be "Listing 16.3".
Submit errata or feedback to the authors.