TOPシステム開発> 【新・言語進化論】プロの言語仕様の読み方> 第3回:マルチスレッドなんて怖くない! (3/3)

【新・言語進化論】プロの言語仕様の読み方

【新・言語進化論】プロの言語仕様の読み方

第3回:マルチスレッドなんて怖くない!

著者:オープンストリーム 鍋倉 康宏

監修者:オープンストリーム 高安 厚思

公開日:2007/11/20(火)

プラットフォームに密接に関係しているスレッド

言語仕様ではマルチスレッド時に問題となるような事象について、プラットフォームレベルにまで言及しています。つまり、マルチスレッドを意識するとプラットフォーム上でどのようにJavaVMが動作をしているのかを理解できるのです。例えば「17.6 Word Tearing(ワードの分断)」には、次のようなことが書かれています。

In particular, two threads that update adjacent elements of a byte array separately must not interfere or interact and do not need synchronization to ensure sequential consistency.(訳:バイト配列において、隣接する要素を個別に更新する2つのスレッドは、干渉したり、影響を与え合ってはならず、順序の整合性を保証する上での同期化を必要とするわけでもないのである)。

Some processors do not provide the ability to write to a single byte.It would be illegal to implement byte array updates on such a processor by simply reading an entire word,updating the appropriate byte, and then writing the entire word back to memory.This problem is sometimes known as word tearing, and on processors that cannot easily update a single byte in isolation some other approach will be required.(訳:プロセッサの中には、単一バイトの書き込み機能が提供されていないものもある。こういったプロセッサでバイト配列を更新する際、ワード全体をそのまま読み込み、適切なバイトを更新した後、ワード全体をメモリに書き戻すような実装を行うことは不正である。この問題は、ワードの分断と呼ばれることもあり、単一バイトの個別更新が容易でないプロセッサの場合、他のアプローチが必要となることを意味している)。

すなわち、メモリ上の同一ワードにマルチスレッドで読み書きをするプログラムの場合、ワード単位で書き込みしてしまうと他スレッドで書き込んだ隣接するバイトを上書きしてしまう現象が発生することがあるのです。

ワードの分断を禁じている仕様がスレッドの章に書かれているのは、ワードの分断が問題となるタイミングがマルチスレッド時にあるからです。このような問題が起きないようにJavaVMが実装されているからこそ、Javaという言語がプラットフォームに依存しないといえるのです。

似たような話に「17.7 Non-atomic Treatment of double and long(doubleとlongの非アトミックな扱い)」の章があります。JavaVMではvolatile修飾されていないdoubleやlongの64bit値は、可能な限り64bitを分割しないことを推奨していますが、32bitずつ2回の書き込みとして処理することは許されています。もしマルチスレッド時に2回書き込みの前半書き込みだけの状態を他スレッドが読み込んだら、当然意図しない値となってしまうため、言語仕様には以下のようにアドバイスがされています。

Programmers are encouraged to declare shared 64-bit values as volatile or synchronize their programs correctly to avoid possible complications.(訳:プログラマは、起こり得る厄介な問題を避けるために、共有される64ビット値をvolatile指定して宣言したり、プログラムを正しく同期化することが推奨される)。



そのような理由から、プログラマはdoubleやlongの64bit値を共有する場合は、volatileを指定して宣言することが推奨されています。プログラマとしては、このような事情まで理解していると、挙動不審なソースコードを書くことがないでしょう。

以上のようにJava言語仕様のスレッドの章ではマルチスレッド時に起こり得る現象を列挙して、JavaVM実装者やプログラマに対してアドバイスをしています。この章を読み解くことで、スレッドがJavaVMでどのように動作し、プラットフォームとどのような関連があるかを理解できるのです。

Java言語仕様は、マルチスレッドという我々の常識では理解しにくい現象を読み解くうえで必ず強い味方となってくれます。もちろんスレッドのみにとどまらず、Java言語仕様はJavaの仕様全般やJavaVMがどのように動作しているのかまで細かな説明がなされています。些細なことまで納得しないと気が済まない人までも、納得できる内容が書かれているのです。

次回の最終回では、初心者が一番つまずきやすい例外処理について上野氏がわかりやすく解説していきます。

参考文献
本連載の英語の訳は、下記の書籍を参考としております。

Java言語仕様 第3版(The Java Series)
ジェームズ・ゴスリン、ビル・ジョイ、ガイ・スティール、ギッラード・ブラーハ著
村上 雅章訳
ピアソンエデュケーションジャパン刊

タイトルへ戻る




株式会社オープンストリーム 鍋倉 康宏
著者プロフィール
株式会社オープンストリーム 鍋倉 康宏
ソフトウェアエンジニアリングラボラトリ システムズアーキテクト
最近は主にSOA関連の調査研究、業務に従事。Hu-Basic、Cの次に学生時代Lispに接触。以来17年、各種関数型言語に魅せられ続けている。Debian GNU/Linuxと英語配列キーボードを愛好。休日は能楽鑑賞と神社仏閣巡礼に繰り出している。最近の関心領域は位相幾何学、圏論、伊勢神宮と鹿島神宮。
http://www.opst.co.jp/


株式会社オープンストリーム 高安 厚思
監修者プロフィール
株式会社オープンストリーム 高安 厚思
テクニカルコンピテンシーユニット 主管システムズアーキテクト
横浜国立大学経営学部卒。銀行系シンクタンクでオブジェクト指向技術の研究に携わった後、大手SIerにてアーキテクチャ構築、プロセス研究に携わった。現在株式会社オープンストリームにてSOAを中心とする研究開発およびアーキテクチャ構築に従事。最近はXMLのダイナミックさに魅了されている。
http://www.opst.co.jp/


INDEX
第3回:マルチスレッドなんて怖くない!
  スレッドを読み解く!
  Java言語仕様のスレッドを読み解く
プラットフォームに密接に関係しているスレッド