TOP
>
設計・移行・活用
> はじめに
Javaコーディング規約
第12回:スレッド・ガベージコレクションに関するコーディング規約
著者:
電通国際情報サービス 高安 厚思、東田 健宏
アイエックス・ナレッジ 河野 弥恵
2006/1/25
1
2
3
4
次のページ
はじめに
最終回である今回は、スレッド・ガベージコレクションに関する規約と他2つの規約について説明します。
スレッドやガベージコレクションは概念の理解が難しく、誤解からコーディングミスをしてしまう可能性があります。
今回説明する規約は標準化というよりも、むしろコーディングミスによるプログラムの誤動作を防ぐ目的で作られたものが主となります。今回説明する規約を上手く利用して、無用なミスの減少に役立ててください。
本連載で紹介する規約に関しては、規約名のみを記述しています。規約そのものは、以下のURLからダウンロードして確認してください。
http://www.objectclub.jp/community/codingstandard/JavaCodingStandard2004.pdf
スレッド
スレッドは並列処理を行うための機能です。まずはスレッドの実装方法に関する規約から説明します。
スレッドは原則Runnableを実装(C_TRD001)
スレッドを使うためには、次の2つの方法があります。
Runnableインターフェースを実装
スレッドクラスを継承
表1:スレッドを使う方法
Javaでは多重継承ができないので2の場合はスレッドクラスのみを継承することになりますが、「クラスは役割を表す」の原則に照らすと「クラスの役割=スレッド」と見えてしまい、本来の役割がわからなくなります。
スレッド化は「+αの機能」です。
Runnableインターフェースを実装し、本来の役割であるクラスを継承してください。
これから説明するスレッドの規約は、改札口モデルのメタファを例にして説明していきます。
スレッドの同期化(C_TRD001)
スレッドによる並列処理を導入するとプログラムの処理効率が向上しますが、1つのオブジェクトに対して複数のスレッドが動作しようとする場合、不都合が生じます(1つのオブジェクトの状態を複数のスレッドが同時に変更してしまうなど)。それを防ぐための仕掛けが同期化(syncronized)です。
例えば、駅の改札口を思い浮かべてください。乗降客をスレッド、改札口を「複数のスレッドが共通して使用するオブジェクト」と考えます。
スレッドを実行すると乗降客が改札を通りますが、1回に複数の乗降客が改札を通ると切符の確認ができません。
そこで「改札口を通る」という処理を同期化します。同期化することにより、1人の乗降客が改札を通っているとき、他の乗降客は改札前で待たされるようになります。
図1:改札口の例
これに対して駅舎の入口は、何人でも同時に通ることができます。よって「駅舎の入口」オブジェクトは、同期化の必要がないことを示しています。
図2:駅舎の例
例えば改札口を通る乗降客の条件を満たしていない場合、改札口はその客を制止しなければなりません。そのような場合、改札口が判断して自分のwait()メソッドを呼びます。
wait()メソッドは、同期化された処理を実行中のスレッドに一時制止を仕掛けるメソッドです。改札口を通っている乗降客を制止して、駅の待合室(オブジェクトプール)に連れて行きます。
図3:wait()メソッド
待合室に入っている乗降客は、改札を通ることができません。後からやってきた乗降客が改札を通っていくのを見ながら切符が再発行されるのを待ちます。切符が再発行されると、待合室の乗降客は再び改札を通れるようになります。
待合室の乗降客を解放するには、notify()メソッド、notifyAll()メソッドを使います。notify()メソッド、notifyAll()メソッドは、オブジェクト上でウェイトしているスレッドを再開するメソッドです。
駅員が改札口の条件を変えて、改札口のnotify()メソッドを呼ぶと、待合室にいる乗降客が1人だけ改札口の前へ誘導されます。notifyAll()メソッドを呼ぶと、待合室の乗降客全員が改札口の前へ誘導されます。
図4:notify()メソッドとnotifyall()メソッド
改札口の前に来た乗降客は再び自由に改札口を通ることができるようになります。
1
2
3
4
次のページ
参考文献など
Javaコーディング規約2004は以下のサイトおよび書籍として発表しています。本連載と共に参考にしてください。
「Javaコーディング規約2004」
http://www.objectclub.jp/community/codingstandard/JavaCodingStandard2004.pdf
「オブジェクト倶楽部」
Javaコーディング規約2004は、オブジェクト倶楽部で公開して頂いております。
http://www.objectclub.jp/
「超図解 Java ルールブック」
Javaコーディング規約が「超図解 Java ルールブック」という名前で書籍になりました。規約の詳しい内容に関しては本書籍をご覧ください。
http://www.x-media.co.jp/xbook/index.cfm?ID=6
Javaコーディング規約を理解するに際しての参考サイトをご紹介します。
「Code Conventions for the Java Programming Language」
http://java.sun.com/docs/codeconv/
※日本語訳を提供しているページ
http://www.tcct.zaq.ne.jp/ayato/programming/java/codeconv_jp/
Java コーディング規約を理解するに際しての参考書籍をご紹介します。
「Java の格言」
「Java の鉄則」
「リファクタリング - プログラミングの体質改善テクニック」
「The Elements of Java Style」
「Effective Java - プログラミング言語ガイド」
「Essential Java Style」
「Javaクックブック」
「標準FindBugs完全解説」
「Java言語で学ぶデザインパターン入門 マルチスレッド編」
著者プロフィール
株式会社電通国際情報サービス 高安 厚思
株式会社電通国際情報サービス 開発技術センター
Java(J2EE)/オブジェクト指向の研究開発やプロジェクト支援、開発コンサルティングに従事。モデル、アーキテクチャ、プロセスが探求対象。今回は Javaコーディング規約2004の仕掛け人。
著者プロフィール
株式会社電通国際情報サービス 東田 健宏
株式会社電通国際情報サービス 開発技術センター
CTI、Webアプリの開発経験を経て、現在は主にプロジェクトマネジメント支援、プロセスエンジニアリング、ソフトウェア工学研究開発に従事。最近はコーチング、ファシリテーションといったヒューマン系スキルに興味を持ち日々修得に努めている。
著者プロフィール
アイエックス・ナレッジ株式会社 河野 弥恵
アイエックス・ナレッジ株式会社 第1事業部所属
主にCOBOL、PL/1等のシステム開発に従事。コーディングに限らず、誰もが気持ちよく守れる規約を模索中。
INDEX
第12回:スレッド・ガベージコレクションに関するコーディング規約
はじめに
(C_TRD002)ウェイト中のスレッドを再開するときはnotifyAll()メソッドを利用する(C_TRD002)
wait()メソッドはwhileブロック内から利用する(C_TRD007)
その他