Атомарные типы. Примитивы синхронизации. Коллекции. ExecutorService. ForkJoinPool. Лекция №11 в курсе "Java" (осень 2014). Преподаватель: Алексей Владыкин. Страница лекции на сайте CS центра (с презентацией): goo.gl/rk1D0k
Одна из самых непростых тем для меня. Пытался понять её не в первый раз. И только благодаря этим двум лекциям появилось какое-то понимание использования многопоточности в Java
По countDownLatch можно наоборот в конце работы каждого потоко вызвать countDown(), а уже в main потоке await(). Это позволит не создавать списска всех потоков, потом опять по нему проходить и вызвыать join()
Использовался Math.sin(), а не StrictMath.sin() - возвращались double-значения с разницей где-то далеко после запятой, но эта разница становилась всё более существенной при многократном суммировании.