7

Java Concurrency in Practiceを読んでいます

事前発生関係に関する特定の説明と混同しています。

それは、

操作は、事前発生と呼ばれる部分順序付けによって順序付けられます

これは、 「部分的な順序付け」とは正確にはどういう意味ですか?

(本に説明はありますが、私にはわかりません)

4

2 に答える 2

3

「Java Concurrency in Practice」という本を参照しているので、Java メモリ モデルに関する部分にいると思います。

プログラマーにとって、CPU が制御フローに関してソース コードに現れる順序でプログラムのステートメントを実行するのは当然のことのように思えます。ただし、コンパイラや CPU アーキテクチャなどの最適化などのいくつかの要因により、異なる低レベルの動作が課せられます。ただし、これはコードを実行するスレッドには表示されません。すべてが順番に行われるかのように動作します。

これは、複数のスレッドには当てはまりません。関係が存在する前に何も起こらない場合、スレッドは別のスレッドのアクションの異なる順序を観察することがあります。したがって、これらのアクションには、特定の順序関係は存在しません。たとえば、スレッドがコードを実行するとき

static Point XY;
…
XY = new Point(3, 4);

別のスレッドは、そのインスタンスのおよびフィールドの初期化の前に、フィールドPointへのインスタンスの格納を観察し、(0,0) または (3,0) または (0,4) ポイントを確認する場合があります。XYxy

XYしたがって、アクション「 の代入」、「 の代入x」、および「 の代入y」とこれらの変数の読み取りとの間に順序関係は存在しません。

変数の宣言を volatile に変更すると、インスタンスの格納とそのインスタンス参照の読み取りXYの間に発生する前の関係が確立されます。それでも、 と の書き込みの間に順序はありませんが、両方の書き込みは、 を介したこれら 2 つのフィールドの読み取りに対して事前発生の関係を持ちます。PointXYxyXY

これが半順序です。順序関係を持つアクションもあれば、そうでないアクションもあります。

于 2013-10-01T22:09:22.233 に答える