(プログラムネタ) マルチスレッドプログラム
2009年07月05日13:27
マルチスレッド対応クラスを設計するときは、必ず、同期オブジェクトの指定ができるようにする必要がある。
1. Javaには特定のオブジェクトに対してひとつのスレッドだけがアクセスしているということを保証するための機構 "synchronization" と呼ばれるものを持っている。 メソッドに synchronized という修飾子をつけると、そのオブジェクト上のメソッドを実行するスレッドが必ずひとつであるということを保証できる。
2. 委譲を使って複雑な多重継承関係を表すことには限界がある。 言語的に多重継承をサポートしていないJava上で多重継承を表現する際、HAS-A / IS-A という二通りの表現方法が考えられる。 HAS-Aで表現するのは比較的簡単である。 IS-A で表現する際は DELEGATION (委譲)という方法を使う以外ない。 委譲はすべてのメソッドに対して転送メソッドを作成する必要があり、作業は複雑である。 委譲を使って複雑な多重継承関係を表すことには限界がある。
3.複数のクラスを組み合わせてあるひとつのマルチスレッド対応のクラスを作成しようとするとき、多重継承を HAS-A で表現してしまうと 同期を取るためのオブジェクトが複数に分かれてしまう。 同期オブジェクトを共通にまとめるためにはすべてのメソッドを委譲を使って実装する以外に方法が無い。
4. 2の理由により、委譲を使った継承関係の表現には限界が生じる。
5.継承関係の表現にHAS-A を使い、かつ、処理の同期をとるためには、そのクラス内で利用されるすべてのマルチスレッド対応クラスが同期オブジェクトの指定する機能を持っていることを必要とする。
==
現状、J2SEのマルチスレッド対応クラスには 同期オブジェクトの指定ができるものは一つも無い。
JAVAにはこういう小さな考慮漏れがたくさんある。 このような小さな考慮漏れがたくさん重なることによって JAVAのマルチスレッドプログラミングがとても複雑になっているのだと思う。
1. Javaには特定のオブジェクトに対してひとつのスレッドだけがアクセスしているということを保証するための機構 "synchronization" と呼ばれるものを持っている。 メソッドに synchronized という修飾子をつけると、そのオブジェクト上のメソッドを実行するスレッドが必ずひとつであるということを保証できる。
2. 委譲を使って複雑な多重継承関係を表すことには限界がある。 言語的に多重継承をサポートしていないJava上で多重継承を表現する際、HAS-A / IS-A という二通りの表現方法が考えられる。 HAS-Aで表現するのは比較的簡単である。 IS-A で表現する際は DELEGATION (委譲)という方法を使う以外ない。 委譲はすべてのメソッドに対して転送メソッドを作成する必要があり、作業は複雑である。 委譲を使って複雑な多重継承関係を表すことには限界がある。
3.複数のクラスを組み合わせてあるひとつのマルチスレッド対応のクラスを作成しようとするとき、多重継承を HAS-A で表現してしまうと 同期を取るためのオブジェクトが複数に分かれてしまう。 同期オブジェクトを共通にまとめるためにはすべてのメソッドを委譲を使って実装する以外に方法が無い。
4. 2の理由により、委譲を使った継承関係の表現には限界が生じる。
5.継承関係の表現にHAS-A を使い、かつ、処理の同期をとるためには、そのクラス内で利用されるすべてのマルチスレッド対応クラスが同期オブジェクトの指定する機能を持っていることを必要とする。
==
現状、J2SEのマルチスレッド対応クラスには 同期オブジェクトの指定ができるものは一つも無い。
JAVAにはこういう小さな考慮漏れがたくさんある。 このような小さな考慮漏れがたくさん重なることによって JAVAのマルチスレッドプログラミングがとても複雑になっているのだと思う。
コメント一覧