削除された内容 追加された内容
タグ: 2017年版ソースエディター
36行目:
 
== Javaの方針 ==
{{独自研究|section=1|date=2019年3月}}
{{正確性|section=1|date=2019年3月}}
{{出典の明記|section=1|date=2019年3月}}
Javaは5つの方針に基づいて開発された<ref>{{Cite web|url=https://www.oracle.com/technetwork/java/intro-141325.html |title=The Java Language Environment |accessdate=2019-04-24}}</ref>。これらはJavaテクノロジの中枢となる[[仮想マシン]]に向けられたものでもあるが、言語仕様にも大きく反映されている。
63 ⟶ 61行目:
'''スレッドの在り方'''
 
: Javaでは[[スレッド (コンピュータ)|スレッド]]ベースの[[並行コンピューティング]]が重視されている。全てのインスタンスに[[同期 (計算機科学)|同期用]]の[[ロック (情報工学)|ロック機能]]が備えられているので、イメージ的にオブジェクト単位の[[排他制御]]が可能となっており、オブジェクト指向と巧みに融合している。[[同期 (計算機科学)|スレッド同期]]には仮想マシン組込の''synchronized''構文だけでなく、様々な並行処理APIも揃えられている。仮想マシンが抱えるスレッド資源の制約を解決する為に、マルチスレッドにタスクの概念仕組みを併せた[[モニタ (同期)|モニタ]](''Executor)の技法''が導入されている。[[ロック (情報工学)|ロック手法]]には[[ミューテックス]]、[[セマフォ]]、バリア、読み書きロック、イベント(''CountDownLatch'')が揃えられており[[同期 (計算機科学)|同期性]]の選択肢も広い。また[[アトミック操作]]をサポートするAPIも揃えられている。
 
'''堅牢性から利便性へ'''
132 ⟶ 130行目:
 
=== スレッド ===
Javaではその前身であるGreenOS用言語およびOakの時代と呼ばれていた頃にあたる主に家電機器向け組込システムへの普及を目指していた極めて初期の段階から、スレッド式(''threaded'')を基底要素にして設計されていた。組込システム開発では主に2~4タスクによる並行処理が要望される状況が頻出しており、大抵はシングルタスクでも実装可能なコルーチンによる交互切り替えフローで対応される事が多かった。家電機器の高機能化に伴うマルチタスク環境のニーズ増加を予測したサン社のプロジェクトチームは、その組み込み分野におけるシェア独占を目指してマルチスレッド機能の標準配備を、プログラミング言語と仮想マシン設計における重要課題としていた。初期バージョンにおけるJavaのスレッドは、仮想マシン実行上のユーザー空間で走行される純粋なユーザースレッドとして実装された。一台のJava仮想マシンの実行は一つのプロセスとなり、Javaのプロセスは始めから複数スレッド(糸)の寄り合わせとして設計されていた。この高度なネイティブスレッド・エミュレート技術は注目を集め、その開発チームの名に因んだグリーンスレッドという名称を確立し、ランタイムライブラリ及び仮想マシン上で走行されるマルチスレッドの代名詞となった。グリーンスレッドは公開初期においては、例えばLinuxのネイティブスレッドよりもやや軽量なパフォーマンスを発揮した。組み込みシステム向けのJava仮想マシンでは基本的にこのグリーンスレッドが標準仕様となり続けている。しかし、パソコンやサーバーマシン用の各OSの間でマルチコアCPUの特性を活かして設計されより更に軽量なネイティブスレッドが一般的になると、グリーンスレッドのパフォーマンスは明確に見劣りするようになった。やむなく開発チームはグリーンスレッドを順次廃止し、JavaのスレッドをOSが提供するネイティブスレッド上で走行させるように設計変更した。特に並行処理同期=排他制御を多用するJavaプログラムにおいては、この時点からプラットフォーム非依存性に対する問題が生じるようになったと言われる。
 
Javaの同期(''synchronization'')設計の特徴としては、全てのインスタンスにロック機能を持たせてる事が挙げられる。同期定義(''synchronized修飾子'')された各メソッドは、自動的に参照インスタンスに排他制御の問い合わせを行う。
 
=== ガベージコレクション ===