JAVA同時プログラミング実戦——対象グループ

2921 ワード

4.1スレッドセキュリティを設計するクラススレッドセキュリティクラスを設計する過程で、以下の3つの基本要素を含む必要がある:1.オブジェクトの状態を構成するすべての変数を見つけます.2.拘束状態変数の不変性条件を見つけ出す(これらの条件を見つけて、これらの条件を同時ポリシー管理してスレッドを安全にする)3.オブジェクト状態の同時アクセス管理ポリシーを確立する.以上の3つは、まず不変条件を持つすべての変数を見つけて、これらの変数の不変性エントリが何であるかを確定してから、これらの不変性条件に対して同時アクセスポリシー管理を行う(つまり同期)スレッドセキュリティを設計できるクラス.4.1.1:同期要件を収集する.クラスのスレッドセキュリティを確保するには、その不変条件が同時アクセスで破壊されないことを確保する必要がある.4.1.2:依存状態の操作ある操作にステータスベースの事前条件が含まれている場合、この操作を依存状態の操作と呼ぶ.例えば、キューは、要素を削除するときにキューが空でない状態である必要があります.同時実行の場合、削除の準備をしている間にキューが空ではない可能性がありますが、他のスレッドがこの状態を変更する可能性があります.キューを空にします.これが先験条件です.不変性条件:例えばIntegerオブジェクトでは、最大値は整数の最大値であり、これが彼の不変性である.加算操作を行う場合.同時の場合、不変性の発生を招く可能性があります.はい、オブジェクトのステータスが無効です.後験条件:例えば1つのIntegerオブジェクトに対してi++を行う;現在の値が19の場合、次の値は必ず20である.取得すると、同時で現在の値が19になる可能性があります.次の取得は確かに20ではない.これが後験条件であり,オブジェクト状態遷移が無効になる.つまり、次のステータスが現在のステータスに依存する必要がある場合です.同時処理が必要です.
4.2インスタンスクローズドオブジェクトがスレッドセキュリティでない場合、インスタンスクローズドメソッドによってスレッドセキュリティインスタンスをクローズドすることもできます(オブジェクトをクラスのプライベートメンバーとして)、役割ドメイン(ローカル変数として)、スレッドクローズド(オブジェクトがスレッドに渡される)
public class PersonSet {
    private final Set mySet = new HashSet();

    public synchronized void addPerson(Person p) {
          mySet.add(p);
    }

    public synchronized boolean containsPerson(Person p ) {
        return  mySet.contains(p);
    }
}

例のPersonSetの状態変数はHashSet集合である.しかし、HashSetスレッドは安全ではありません.しかし、私たちはHashSetをクラスのプライベートメンバーに閉じ込めます.HashSetコレクションにアクセスするパス(addメソッドとcontainsメソッド)をロックします.これによりPersonSetというクラスはスレッドが安全になります.
4.2.1 Javaモニタモード:javaオブジェクトごとに同期を実現するロックを作成できます.これらのロックを内蔵ロック(Intrinsic Lock)またはモニタロック(Monitor Lock)javaモニタモードと呼ぶのは、クラスのドメイン変数に対して、同じロックオブジェクト保護の同期コードを最初から最後まで使用してアクセスできる場合、javaモニタモードに従うコードである.
public class PersonSet {
     private Integer age;

    public  synchronized Integer getAge() {
        return age;
    }

    public synchronized  void setAge(Integer age) {
        this.age = age;
    }
}