kagamihogeの日記

kagamihogeの日記です。

Java並行処理プログラミング

ここ数年でマルチコアだ非同期処理だなんだで並行プログラミングが話題のトピックに上がることもあり、Javaの並行処理プログラミングをもちょっと勉強しておいた方が良いかな、と思い評判高い本書を手に取った。内容が内容だけにかなり手ごわい相手であり、読むのに相当な時間を要したけれど、その分の収穫はあった。なので、読み切った感というか満足感も中々であった。

本書は色々なことが書いてあるけど、まず得られるのはjava.util.concurrentの知識。結構前から機能追加されてたのは知ってたんだけど、使う機会が無いので「なんか便利そうなのがいるけど良く分からない」状態だったんですよね。コイツらは一言でまとめてしまえば、既存のwait/notify/yieldとかが低レベルAPIだとすれば高レベルAPIという位置付け。おそらくjava.util.concurrent登場以前は、個々のプロジェクトでjava.util.concurrent相当のものを作りこんでいた、ってことなんでしょうね。ExecutorやSemaphoreやConcurrentなコレクションなんかは、使い方覚えるだけで効果が得られる優れもの。

しかし、良い事尽くめばかりというわけでもない。Concurrent APIの登場で並行プログラミングがやりやすくなったのは事実だけど、並行プログラミングそのものが抱える複雑性が無くなったわけではない。本書では並行プログラミングで得られるメリットを語りつつ、安易に並行プログラミングに手を出すべきでない点についてもかなりの分量を割いている。遥か太古の昔から語り継がれる通り「推測するな計測せよ」ということです。ものすごく短いコードでものすごく分かりにくい欠陥が発生する例も交えつつ、並行プログラミングの罠とそれにどう対処するかやテストの方法についても同時に解説されています。

てなわけで、Javaの並行プログラミングはだいぶ身近なものになったとはいえやはり伝家の宝刀チックだな、というのが俺の印象です。抜かずに済めばそれでよし、しかし抜いた時には覚悟を決めて使いこなさないといけない、みたいな感じ? あとは、俺の対象領域は、CPUよりDBのI/Oの方がボトルネックになりやすいんで、相対的にアプリケーションレベルの平行化の重要性は低めになりがちだし、直近ではConcurrent API使うことないかもなーとか。

ただ、並行プログラミングがエキスパートなプログラマの手の物だったのが、俺くらいのレベルのプログラマでも何とか扱える代物になってきた意味は大きいんじゃかなろうか。手数の一つとして最低限の知識を持っておくのは有効な気がなんとなーくするんですよね。ハードウェアやJVMの進化で何故に実行性能が上がるのかも本書で解説されてるんだけど、それを把握出来るようになるだけでも違うような気がしないでもない。

並行プログラミングは非常にややこしいけど、そんだけ味わい深いものがあることを教えてくれた一冊でした。

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

Java並行処理プログラミング ―その「基盤」と「最新API」を究める―