「Java」の版間の差分
削除された内容 追加された内容
タグ: 2017年版ソースエディター |
Goldensundown2 (会話 | 投稿記録) |
||
(同じ利用者による、間の3版が非表示) | |||
63行目:
'''スレッドの在り方'''
: Javaでは[[スレッド (コンピュータ)|スレッド]]ベースの[[並行コンピューティング]]が重視されている。全てのインスタンスに[[同期 (計算機科学)|同期用]]の[[ロック (情報工学)|ロック機能]]が備えられているので
'''堅牢性から利便性へ'''
132行目:
=== スレッド ===
Javaではその前身であるGreenOS用言語およびOakと呼ばれていた頃にあたる、主に家電機器向け組込システムへの普及を目指していた初期の段階から、スレッド式(''threaded'')を基底要素にして設計されていた。組込システム開発では主に2~4タスクによる並行処理が要望される状況が頻出しており、大抵はシングルタスクでも実装可能なコルーチンによる交互切り替えフローで対応される事が多かった。家電機器の高機能化に伴うマルチタスク環境のニーズ増加を予測したサン社のプロジェクトチームは、その組み込み分野におけるシェア独占を目指してマルチスレッド機能の標準配備を、プログラミング言語と仮想マシン設計における重要課題としていた。初期バージョンにおけるJavaのスレッドは、仮想マシン
Javaの同期(''synchronization'')設計の特徴としては、全てのインスタンスにロックオブジェクト機能を持たせてる事が挙げられる。このロックは''synchronized''キーワードで示される標準同期構文で使用される。標準同期はJava仮想マシン内包仕様であり、機能的にはミューテックスに相当する。''synchronized''修飾子を付加された各メソッドはその全体が排他制御エリアとなり、呼び出し時はデフォルト的にthisインスタンスからロックを取得するので、イメージ的にオブジェクト(=インスタンス)単位となる排他制御が容易に実装できた。このロック普遍化はオブジェクト指向との協調を明確に表現した設計と言える。''synchronized''クラスメソッドの方は、システム内に存在するクラスオブジェクトからロック取得を試みるので、これもイメージ的に同種オブジェクト(同属性インスタンス)共通の同期と排他制御を表現できた。また、''synchronized()''定義子の波括弧で任意のコード部分を括る事により、メソッド内に部分的な排他制御エリアを設ける事が出来る。ここではthis以外のインスタンスもロックオブジェクトに指定出来るので多様な同期が可能となった。上述の排他制御エリアの仕組みは基本的に入口でロックを取得し、出口でロックを解放するものである。ロックが取得出来なかったら待機キューに入れられる。再入可能(リエントランス)に設計されているので再帰アルゴリズムなどで一度ロックを取得したスレッドが再び入口を通る時はそのまま素通りする。エリア内からのメソッドリターンは同時に出口通過と見なされてロックを解放する。ただしエリア内ですでにロック解放(''notify'')を行っている場合はそのまま脱出する。エリア内では任意位置での待機キュー入り(''wait'')も可能で同時にそこでロックも解放される。状態異常発生時は各スレッドに例外を投げて待機キューから強制脱出させる事も出来る。この標準同期は、組み込みシステムやさほど複雑でないアプリケーションの実装をほとんどカバー出来るものと言える。またこのミューテックス相当の機能は様々に応用可能でもある。しかし、実際にカウントセマフォやバリアや読み書きロックなどを再現しようとすると余計なワンステップを必要としがちなので、それらのロック手法は専用のAPIで用意されている。
スレッドはその性質ごとにスレッドグループにまとめる事が出来て同時に様々な一括操作も可能となっている。これはクライアント・サーバーシステムの実装でよく用いられる。また膨大な数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成と破棄の繰り返しによる負荷増大を解決する為の、スレッドプールとタスクキューを併せたいわゆるモニタの技法を提供するAPIも用意されている。
=== ガベージコレクション ===
|