3

私が行っている研究の一環として、Scala や Clojure などの言語を使用して JVM で並行性を実現することの想定される単純さを探っています。簡単にすることで、これらの言語が Java 7 が提供するものよりも簡単な同時実行構造を提供することを証明したいと考えています。

したがって、Java の並行性モデルの複雑さを説明する優れた参考文献を見つけたいと思っています。

Google の方向性を示す以外に (私はすでに限られた成功で検索しました)、知識のある人がこの分野で始めるための良い参考文献を提供してくれれば幸いです.

ありがとう

4

2 に答える 2

1

高水準言語は複数のコアを使用する方が簡単ですが、しばしば忘れられるのは、プログラムを高速化するため、つまりスループットを向上させるために複数のコアを使用する理由です。

並行性を向上させるオプションを検討する場合、これらのオプションが実際に何らかの方法でパフォーマンスを向上させるかどうかをテストする必要があります。(そうでない場合が多いので)

たとえば、STM (ソフトウェア トランザクション メモリ) を使用すると、同時実行性の問題を心配することなく、マルチスレッド アプリケーションを簡単に作成できます。問題は、単純な例の場合、STM を使用せずに 1 つのスレッドのみを使用する方が高速であることです。

複数のスレッドを使用すると、複雑さが増し、アプリケーションがより壊れやすくなります。そのため、それを行うには正当な理由が必要です。それ以外の場合は、可能な限り単純なソリューションに固執する必要があります。

詳細については http://vanillajava.blogspot.co.uk/2011/11/why-concurency-examples-are-confusing.html

于 2012-08-31T06:01:10.723 に答える
1

Java はラムダ式をサポートしていません。インライン コールバックの作成 (非同期呼び出しの完了など) には、匿名型のボイラープレートが 5 行必要です。

これは、人々がコールバックを使用することを強く思いとどまらせます。C# には2005 年以降Runnableにあるのに対し、Java 7 には ( and とは対照的に) 値を取るコールバック用のインターフェースがまだないのはおそらくこれが理由です。Callbable

したがって、JDK には、非同期操作に対する実際のサポートはありません。
非同期操作の鍵は、長時間実行されるリクエストを開始し、リクエストの実行中にスレッドを消費することなく、終了時にコールバックを実行する機能です。Java ではget()Future<V>. これにより、標準 API を使用するアプリケーションの同時実行性が、適切にサポートできるスレッド数に制限されます。

この問題を解決するために、Java コードを改善するための Google の Guava フレームワークは、完了コールバックを持つListenableFuture<V>インターフェイスを導入しています。

Scala などの言語は、ラムダ式 (匿名クラスにコンパイルされる) をサポートし、独自のPromise / Future型を追加することで、この問題を解決します。

于 2012-08-31T03:13:15.763 に答える