Javaの並行処理(D):セキュリティスレッドオブジェクトを確保する方法

01、はじめに

私はそれBiechu内部の損傷を言っていない、心とそれの魂を吐くしてみましょう。「Javaの並行処理が戦闘で、」それは並行プログラミングの古典とみなされているにもかかわらず、退屈、私は助けることができないものをこの本テテ。第IV章は、「複合オブジェクトは、」私は全体の2週間を食べたので、唯一の豚肉を指摘食べます。

読者は、ああ私を許します。私はあなたが本当にこの本鈍い退屈な技術を読み取ることができない、学習能力を非難せいに自分自身を制限しました。しかし、将来的には、進行し、学ぶために(叫びスローガンが大きくビット)、だけ弾丸をかみます。

私と一緒に来てください、私は興味深いポイントを記述してみてください。

02、スレッドセーフなクラス

著者らは、ああ、言って、スレッドセーフなクラスを設計するには、3つの手順が必要です。

1)すべての変数の状態を表すオブジェクト識別
変数の有効性が制約2)
クラスを増加させる3)同時アクセスポリシーを

私は、より容易に理解読み、言うに基づいて微調整を行います。そして、どのようにコードは、従来のカウンタタイプのカウンターを初めて目に関連付けられています。

public class Counter {
    private int value = 0;

    public int getValue() {
        return value;
    }

    public int increment() {
        return ++value;
    }
}

1)カウンター状態変数は、値が一つだけです。

妥当性2)の値は何それは、それが最大値を超えることができないですInteger.MAX_VALUE(私は否定的に思い出すことができない、まあカウント)、最小値は0のみ可能。換言すれば、有効な値は0までの範囲Integer.MAX_VALUE

public int increment() {
    if (value == Integer.MAX_VALUE) {
        throw new IllegalStateException("counter overflow");
    }
    return ++value;
}

3)同期に直接同時アクセスポリシーのクラスを高めます。

public class Counter {
    private int value = 0;

    public synchronized int getValue() {
        return value;
    }

    public synchronized int increment() {
        if (value == Integer.MAX_VALUE) {
            throw new IllegalStateException("counter overflow");
        }
        return ++value;
    }
}

03、非スレッドセーフオブジェクト

前に、我々は、スレッドセーフなクラスを設計する方法について話しています。クラスが安全であるならば、それはスレッドセーフを使用するオブジェクトとして使用されています。クラスはスレッドセーフでない場合、オブジェクトはスレッドセーフであることが保証どのように使用される。しかし、それが使用されていますか?

著者は、「クローズ機構」と呼ばれる用語を言及します:

1)プライベートメンバ変数のクラスとしてオブジェクト、
2)ローカル変数の方法として被検体内;
3)スレッドBのスレッドがオブジェクトを渡すために、オブジェクトがスレッドBと共有されません。

次のコードを見てください。

class StringList {
    private List<String> myList = new ArrayList<>();
    
    public synchronized void addString(String s) {
        myList.add(s);
    }
    
    public synchronized void removeString(String s) {
        myList.remove(s);
    }
}

ArrayListの自体はスレッドセーフではありませんが、はmyListは、プライベートで、その2つのアクセス方法addString()removeString()キーワードを追加してsynchronized、使用中のスレッドセーフなオブジェクトになったときにそのためはmyList、STRINGLISTクラスはスレッドセーフになりクラス-この方法でJavaモニタモードと呼ばれる:状態変数をクラスにカプセル化され、彼らはロックを添加する方法によってアクセスすることができます。

ビューソースベクトル、そしてあなたはそれがスレッドセーフである理由は、モニタモードが使用されていることがわかります

04、既存のスレッド・セーフ・クラスの追加機能

今、スレッドセーフなクラスは、以前にSTRINGLISTを述べたように、存在する場合、それは確かに我々はそれの元のスレッドの安全性への追加機能を破壊しない?作る方法を、私たちが必要とする機能が、十分ではないのほとんどが含まれていますか

最も直接的な方法は、私たち自身の手で元嘘ならば、次に、ソースコードを変更することです。

class StringList {
    private List<String> myList = new ArrayList<>();
    
    public synchronized void addString(String s) {
        myList.add(s);
    }
    
    public synchronized void addIfNotExist(String s) {
        boolean isExist = myList.contains(s);
        if (!isExist) {
            myList.add(s);
        }
    }
}

私たちは、追加したaddIfNotExist()メソッドを:文字列sは、それらのリストに追加されていない場合、あなたは1を追加します。

新しい方法は、2つのスレッドが同時に実行するときので、STRINGLISTスレッドの安全性を破壊しないaddIfNotExist()、方法ながら通過する必要がありsynchronized、この道路の警備ゲートを。

しかし、非常に多くの場合、我々は直接ソースコードを変更することはできません、この時間は、元に基づいて修正する必要がありました。私たちはあなたの前に「レッドチップ」ブラウザのことを聞きましたか?Googleのブラウザ上のコア層の皇帝の新しい服に包まれました。

class StringList {
    protected List<String> myList = new ArrayList<>();
    
    public synchronized void addString(String s) {
        myList.add(s);
    }
}

public class NewStringList extends StringList {
    public synchronized void addIfNotExist(String s) {
        boolean isExist = myList.contains(s);
        if (!isExist) {
            myList.add(s);
        }
    }
}

STRINGLISTから継承された新しいクラスNewStringListを作成し、その後にNewStringListにメソッドを追加addIfNotExist()もちろん、これは親クラスはmyListではなく、民間よりも保護されていることを前提としています。したがって、このアプローチは普遍ありません。

最終的には05、

私の視点に立ち、第IV章「戦闘でのJava並行処理」と書かれた「オブジェクトの組み合わせは、」吸います。これは極端な痛みを感じたときに、この記事を書くために私を導きました。私が悪いので、次の章を書きたくはありません。

前:Javaの並行プログラミング(C):どのように共有変数の可視性を確保するために?

上のパートI:Javaの並行プログラミング(2):セキュリティスレッド

:一部の上にJavaの並行プログラミング(A):しきい値

お読みいただきありがとうございました、独創性が賞賛を指すようにように、これは私の最強の記録パワーとなり、容易ではありません。あなたはあなたの助けのための記事だと思いますが、また上の非常に興味深い、マイクロチャンネル検索した場合、「サイレント王、」キーワードの後の注意を返信「戦闘でのJava並行処理」、あなたは(推奨買い紙の本を書籍の電子版を入手することができます)。

おすすめ

転載: www.cnblogs.com/qing-gee/p/11802921.html