私は本書「Javaの同時実行性」を読んでいます。著者はアドホックスレッドの閉じ込めの例を提供しておらず、スレッドの閉じ込めを維持する責任が完全に実装に当てはまる時期について記述しています。Javaにおけるアドホックスレッドの閉じ込めの例
例を挙げてください。閉じ込め、ThreadLocalなどのスタックの違いを理解できません。
ありがとう。
私は本書「Javaの同時実行性」を読んでいます。著者はアドホックスレッドの閉じ込めの例を提供しておらず、スレッドの閉じ込めを維持する責任が完全に実装に当てはまる時期について記述しています。Javaにおけるアドホックスレッドの閉じ込めの例
例を挙げてください。閉じ込め、ThreadLocalなどのスタックの違いを理解できません。
ありがとう。
可能であれば読んだ本では、より強力な形式のスレッド閉じ込め(StackConfirmedまたはThreadLocal)を使用してください。
彼らのために、サンプルクラスはここにある:実際には
、このアプローチは、スレッドの閉じ込めが自分自身を制御するため、プログラマに完全に依存し、で提供されていないことを意味しJava言語の構文の保証。あなたは明確な単語のアドホックな意味を見てください。
これは、開発者として、オブジェクトへの参照がスレッド外でエスケープされないようにすること(つまりアドホック)が行われることを保証することを意味します。この例を考慮すれば
は例えば、したがって、それへの参照を取得することは不可能であろう、ローカル変数countに
public int countLions(Collection<Animal> animals) {
int count = 0;
for (Animal animal : animals) {
if (animal.getType() == "Lion") {
count++;
}
}
return count;
}
(実際にはJavaの並行処理でスタック閉じ込め例のバージョンを簡素化)言語セマンティクスにより、外部に参照を公開することはできません。したがって、あなたはStack Confinementを持っています。 int count
の代わりにオブジェクト参照を使用していた場合は、メソッドの外部にその参照を公開しないように少し注意する必要があります。
したがって、アドホックスレッドの閉じ込めは、基本的に開発者がオブジェクト参照が誤って外部に公開されていないことを保証する必要があることを意味します。アドホックスレッドのconfimenetには、開発者を支援するための特別な言語機能(Stack Confinement、Thread Localなど)はなく、Thread Confinementを管理するのは開発者の責任です。
また、アドホックスレッドの閉じ込めに関するテキストの理解に問題がありました。しかしhttps://www.cs.umd.edu/class/spring2013/cmsc433/Notes/10-CMSC433-Confinement.pdfの助けを借りて、私はそれがこの意味を考える:スレッドconfimentの
最もアドホックな方法は、単に彼らは、特定のオブジェクトにアクセスしないことを他のプログラマに(英語のような)平易な言葉で文書化/言っています。
PDFリンクは言及:あなたは 共有状態の使用を制限するために規則のセットを決定し、その後、すべてのコードを持って仕事 それに従うことができ
。 はと一致し、の場合はとなり、ロックが必要ない場合は となります。管理している場合は ですただし、 の言語レベルではなく、100%の人間レベルの 保護を使用しています。 アドホック契約の一部は、 という非常に特殊な方法で状態を共有することができます。共有されるものはすべて volatileとマークされ、共有オブジェクトごとに1つのスレッドだけが に書き込むことができます。シングルライターの マルチリーダーシナリオでは、変数がvolatileである場合は、 の場合は同期が必要ありません。 非常に壊れやすいと非常に微妙!
ですから、例えば、このようなものを文書化するような単純なことができます
// Don't use this object in other threads than Thread X
private SomeType someObject;
public SomeType getSomeObject() { return someObject; }
または
// Don't modify this from any other thread than Thread X.
// So use it read-only for those other threads.
private volatile int someNumber;
ブック内のテキストが、次の場合
が記述するスレッドの閉じ込めを維持する責任は実装全体にありますn
この文脈では、「実装」という言葉は多少不明です。単語はコードを示唆しますが、 "ドキュメント"という言葉の使用や共有データのクライアントの実装/使用は、より明確になります。