並行プログラミング(1) - 基本

パラレルと同時

パラレル:複数のタスクの同時実行を。例えば、二つの並列タスクのCPUコアの量は2です。

同時実行:単位時間当たりに実行できるタスクの数。CPUは、単一のコアであれば、単位時間は1秒、CPU 1秒で実行いう同時タスクの数です。シングルコアCPUは、同時にスレッドで実行することができます。1秒間に100個のスレッドを交互に行うことができること。すなわち、並行処理は100です。

高並行性の利点

1、CPUリソースをフルに活用します

2、応答時間を改善するために、

図3に示すように、コードは、モジュール式、非同期と簡略化することができます

マルチスレッドの考慮

1、スレッドセーフ

2、デッドロック

移行します3、あまりにも多くのスレッドでも、ダウンタイムサーバーリソースを消費し、

Javaのマルチスレッド

Javaのスレッド情報の印刷を実行します。

public class Test {
    public static void main(String[] args) {
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
        // 打印线程信息
        System.out.println("打印结果:");
        for (ThreadInfo threadInfo : threadInfos) {
            System.out.println(threadInfo.getThreadId() + ":" + threadInfo.getThreadName());
        }
    }
}

/*
 * 打印结果:
 * [6] Monitor Ctrl-Break
 * [5] Attach Listener
 * [4] Signal Dispatcher
 * [3] Finalizer
 * [2] Reference Handler
 * [1] main
*/

Javaのスレッドを作成するには、2つの方法があります。

クラスの継承を通し、その後、実行可能スレッドの実行を実装します

スレッドは、スレッド、タスクのRunnableを単に抽象的抽象化したものです。

説明スレッド

関連メソッドスレッド

開始()

スレッドを起動します。割り当てCPU、呼び出し実現()メソッドの後に実行するために割り当てられたCPUを待っているレディキューにスレッドをしてみましょう。start()メソッドを繰り返し報告[そう] java.lang.IllegalThreadStateException例外呼び出すことはできません。

実行()

論理方法のメインスレッド

産出()

現在のスレッドが時間を設定することはできません、それはロックのリソースを解放しません、それはロックを保持しないことがありそうという、CPUの所有物を生み出します。あなたは、リソースの後に降伏方法リリースロックを呼び出すことができます。歩留まりを実行するすべてのスレッドは()オペレーティングシステムが実行され、すぐに再度チェックされます後にレディ状態に入る可能性があります。

睡眠()

指定されたスレッドのスリープ時間は、ロックリソースを解放しません。

参加します()

現在のスレッドに追加指定されたスレッドは、交互に行う2つのスレッドが実行順序に組み合わせることができます。例えば、呼び出しスレッドB、スレッドA参加()メソッドは、スレッドAまで終了した後、スレッドBを実行し続けます

割り込み()

ロゴ中断スレッドisInterruptedを()デフォルトは、次いで、状態がtrueに設定されているスレッドの呼び出し割り込み()メソッド、isInterruptedを()割り込みがtrueに設定されているかどうかを識別する、そしてもしそうであれば、割り込みスレッドを決定することによりスレッドとして、偽です。Thread.interrupted()メソッドは、割り込みフラグがtrueに設定され、それは最終的に、割り込みフラグを偽にリセットされるかどうかを決定するために用いることができます。

待つ()

待ち状態にスレッド、限りの通知や中断のための別のスレッドの待機は戻りません。

通知()| notifyAll()

予告[|]このオブジェクトのスレッド上のすべての待機中は、スレッドがロックオブジェクトを取得するに前提が返され、waitメソッドから返されます。私は、スレッドが待ち状態に再入力ロックする取得できませんでした。

スレッドのデッドロック状態が中断することはできません。

スレッド間の共有とコラボレーション

内蔵同期ロック

リエントラントロック。

それは、同時に複数のスレッドが、唯一のスレッドがメソッドまたはブロックを同期化されることを確実にすることがとしても知られている可視性と可変アクセスの排他的スレッドを保証内蔵ロック機構。

オブジェクトのロックとロックのクラス:

オブジェクトは、オブジェクト・インスタンスのための方法であって、ロック、またはクラスのオブジェクトのインスタンスは、クラスのオブジェクトのロックまたはクラスの静的メソッドのクラスです。クラスのオブジェクトのインスタンスが多くを有することができるが、各クラスは、1つのクラスのオブジェクト、別のオブジェクトのインスタンスが互いに干渉オブジェクトロックを有しているが、各クラスは、1つのクラスのロックを有しています。

揮発性

異なるスレッド変数の操作の可視性を確認してください。スレッドは、変数の値を変更するとき、他のスレッドに新しい値が直ちに表示されています。

該当するシーン:スレッドの書き込みには、複数のスレッドを読んで

// volatile多线程写不安全示例
public class TestVolatileSafe {
    private volatile Integer count = 0;

    public void add() {
        count++;
    }

    public static void main(String[] args) throws Exception{
        TestVolatileSafe testVolatileSafe = new TestVolatileSafe();

        new ThreadClass(testVolatileSafe).start();
        new ThreadClass(testVolatileSafe).start();

        Thread.sleep(5000);

        System.out.println(testVolatileSafe.count);// 每个线程对count加1万次,最终结果不是2万
    }
}

class ThreadClass extends Thread {
    private TestVolatileSafe testVolatileSafe;

    public ThreadClass(TestVolatileSafe testVolatileSafe){
        this.testVolatileSafe = testVolatileSafe;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            testVolatileSafe.add();
        }
    }
}

ThreadLocalの

訪問の時の各スレッドは、このようにデータ共有のためのデータの複数のスレッドを単離し、同じオブジェクトでないように、各スレッドThreadLocal変数のコピーを提供します。

すなわち、各スレッドデータベース接続オブジェクトのマルチスレッドを防止するスプリングThreadLocalのトランザクションタイプの手段によって修飾されます。

ThreadLocalの方法:

空のセット(Object値);

オブジェクトのget();

空のremove();

保護されたオブジェクトはinitialValue()。

どうやらサブクラスのカバーデザインを可能にするために、保護された方法であり、このスレッドローカル変数の初期値に戻ります。この方法では、遅延呼び出しに、コールget()メソッドであるかのセット(オブジェクト)とき実行スレッドは初めて、と一度だけ実行します。直接リターンのデフォルトのThreadLocalはnull。

説明:

ThreadLocalのThreadLocalMapの静的内部クラス、ThreadLocalの内部静的内部クラスは、エントリ、エントリ静的内部クラスの継承を有します

WeakReference[弱引用]。

ThreadLocalMapが各スレッドに固有の、ThreadLocalMap ThreadLocalの自体のキーは、キーのエントリは、スレッド自体です。

ThreadLocalのトリガーメモリリーク:

強い参照:同様の「=新しいオブジェクト(Oオブジェクト);」、長い強い参照が残っているとしてとして、ガベージコレクタが回収され、参照オブジェクトのインスタンスを落ちることはありません。

ソフト参照は:ではなく、同様に必要なオブジェクトと同様に、いくつかを記述するために使用されます。システムは、メモリのオーバーフロー例外の前に行われるオブジェクトに関連付けられたソフト参照のために、これらのオブジェクトは、回収された第二のリサイクルの範囲内の実施例として記載されるであろう。回復が十分なメモリをしていない場合は、メモリ・オーバーフローの例外がスローされます。JDK1.2後は、ソフト参照を実装するためにSoftReferenceクラスを提供します。

弱参照:オブジェクトを記述するために非必須であるが、その強度がソフト参照よりも弱い、弱いオブジェクトインスタンスに関連付けられた引用のみガベージコレクションが発生し、次回まで生存することができます。ときに、ガベージコレクタジョブに関係なく、現在のメモリの妥当性の弱い参照に関連付けられている失われたオブジェクトインスタンスを回復します。JDK 1.2の後、弱い実装に弱い参照クラスを提供します。

仮想参照:ゴーストやファントムは、引用文献としても知られ、それは最も弱い1つの参照関係です。オブジェクトインスタンスの存在は、その寿命を傷つけることはありません、ファントム参照オブジェクトのインスタンスによって達成することができない、仮想的な基準です。仮想基準ターゲットを設定する唯一の目的は、オブジェクトのインスタンスは、コレクタを回収するときに通知を受け取るためにシステムに関連付けられています。JDK 1.2の後、仮想基準を実装するためにPhantomReferenceクラスを提供します。

分析:

    各ThreadLocalMapを維持スレッド、キーマッピングテーブルがThreadLocalのインスタンス自体である、ThreadLocalの自体が値を格納していないと言うことですオブジェクトの値を格納するための本当の必要性はそれだけのスレッドがThreadLocalMapから値を取得してみましょうするためのキーとしてである、です。注意深い観測ThreadLocalMapは、このマップは、オブジェクトが弱参照がGCで回収され、ThreadLocalのは、弱いキー組み込まれ使用されています。このように、ThreadLocal変数がnullに設定されている場合、任意の強いThreadLocalのインスタンスへの参照が、それができなくなりますThreadLocalのGCは回復しました。その結果、ThreadLocalMapは、エントリ・キーに表示されますnullの場合、アクセスする方法はありません値のヌルエントリにキー現在のスレッドがまだ終了を遅らせる場合は、null値を入力するためのこれらのキーが常に存在します強参照のチェーン:スレッド参考 - >スレッド - > ThreaLocalMap - >エントリ - >値、この値は、アクセスされることはありませんので、メモリリークがあります。

ソリューション:

    現在のスレッドのみが終了した後、現在のスレッドは、強い参照が外し、現在のスレッド、地図値は、すべてのGC回収されるスタックは存在しないでしょう。ベストプラクティスはのThreadLocal変数の使用を必要としないようにしたら、データを削除するには、そのremove()メソッドを呼び出しています。

待機/通知メカニズム

nofity()

    waitメソッドから復帰するために、オブジェクト上で待機しているスレッドを通知しますが、前提がスレッドに返されることはロックオブジェクトを取得し、スレッドが再入力待ちの状態にロックを取得していません。

nodifyAll()

    このオブジェクトのスレッド上のすべての待機を通知

待つ()

    このメソッドは、別のスレッドや割り込み通知が戻りません待つために、待機状態にスレッドと呼ばれています。待機()メソッドの呼び出し後、オブジェクトのロックを解除します。

(ロング)待ちます

    パラメータがリターンにタイムアウト通知がない場合、あるnミリ秒待機するミリ秒単位の時間、あるタイムアウト時間を、待っています。

待ち時間(長い、int型)

    よりきめ細かい制御のタイムアウトのために、あなたはナノ秒を達成することができます。

パラダイムの待機/通知

    パーティーのために待って:

        オブジェクトのロックを取得

        条件が満たされない場合は、まだ条件をチェックし、通知された後、オブジェクトの待機()メソッドを呼び出します

        論理条件を対応する実行され満足しています

    パーティーに通知:

        オブジェクトのロックを取得するには

        変更の条件

        オブジェクトのスレッド上のすべての待機を通知

リリース5元の記事 ウォンの賞賛0 ビュー119

おすすめ

転載: blog.csdn.net/u010636239/article/details/105131012