OS のスケジューリング/スレッド化アルゴリズムが Java スレッドに影響を与えることは明らかですが、
スレッドは OS/マシンに依存していると安全に言えますか?
この場合、Java プラットフォームに依存しませんか?
OS のスケジューリング/スレッド化アルゴリズムが Java スレッドに影響を与えることは明らかですが、
スレッドは OS/マシンに依存していると安全に言えますか?
この場合、Java プラットフォームに依存しませんか?
はい、Java でのスレッドのスケジューリングの詳細は、JVM の実装と (通常は) OS の実装にも依存します。
しかし、そのスケジューリングの詳細も Java SE 仕様では指定されておらず、選択されたいくつかの基本ルールのみが指定されています。
これは、OS 固有のスケジューリングがこれらの基本ルールに準拠している限り、JVM 仕様にも準拠していることを意味します。
コードがJVM 仕様で指定されていないスケジューリングの詳細に依存している場合、それは実装の詳細に依存しており、どこでも機能するとは期待できません。
これは、ファイル I/O とほぼ同じ状況です。パスをハードコーディングし、固定のディレクトリ セパレータを使用すると、仕様外で作業していることになり、コードがクロスプラットフォームで動作することを期待できなくなります。
編集:もちろん、 JVM実装自体 (つまり、JRE)はプラットフォームに依存します。これは、純粋な Java プログラムがプラットフォームの詳細を気にしないようにするレイヤーを提供します。これを実現するには、JREをpaltform 固有にする必要があります。
... Java は通常、ネイティブ スレッドを使用しますが、一部のオペレーティング システムでは、いわゆる「グリーン スレッド」を使用します。これは、JVM 自体が処理し、単一のネイティブ スレッドによって実行されます。
これについて心配する必要はありません。これはすべて JVM によって処理され、プログラマには見えません。私が考えることができる唯一の実際の違いは、グリーン スレッドを使用する実装では、マルチスレッドの分割統治アルゴリズムによるパフォーマンスの向上はないということです。ただし、ネイティブ スレッドを使用するがシングル コアのマシン上で実行される実装についても、同じようにパフォーマンスが向上しません。
同じプラットフォームでも、安全でないマルチスレッド コードを記述した場合、動作は完全な構成の詳細、残りのマシン負荷、および多くの運、さらにはハードウェアと OS に依存する可能性があります。安全でないプログラムは、ある日は正常に動作しているように見えても、同じハードウェア上で多かれ少なかれ同じワークロードで次の日に失敗する可能性があります。
安全なマルチスレッド コード (Java 言語仕様とライブラリ API で約束されていることのみに依存するコード) を作成する場合、プラットフォームの選択はもちろんパフォーマンスに影響しますが、機能的に動作するかどうかには影響しません。