Javaのマルチスレッド、死レベル&脳死レベルを求めます

多くのJava開発者は、マルチスレッドの開発に新しいです。しかし、たとえ経験豊富な開発者は、多くに陥る多线程罠。この部分の反例の、基本的に番号が、いくつかの非常に低いレベルの共通。あなたのプログラムが適切な期待を持っていない場合は、私はこの記事があなたがそれらの機微を理解するのに役立ちます願っています。

もちろん、また、優れた負荷力のインタビューを使用。

10へ初。

私はレベルを評価するために使用しました

スレッドプールを作成命知らず

現象:システムリソースの枯渇、死んだプロセス。

理由:各メソッドの実装は、新しいスレッドプールです。サンプルコード。

妹の味ソリューション:スレッドプールを共有します。

死の評価を求める:5つ星

脳損傷の評価:5つ星

void doJob(){
    ThreadPoolExecutor exe = new ThreadPoolExecutor(...);
    exe.submit(new Runnable(){...})
}
复制代码

ロックリーク

現象:スレッドがロックを解除せずに開催された、ロックは漏れの原因となります。

原因:原因不明の異常やロック解除ロジック機能が実行されていません。

妹の風味策:常に最終的に入れて機能のロックを解除します。

死の評価を求める:三つ星

脳死評価:Four星

private final Lock lock = new ReentrantLock();
void doJob(){
    try{
        lock.lock();
        //do. sth
        lock.unlock();
    }catch(Exception e){
    }
}
复制代码

同期変数を忘れ

現象:特定の条件下では、ないIllegalMonitorStateExceptionをスローします。

理由:など、通知、待って呼び出し、同期を忘れ、または間違った変数を同期します。

妹の味ソリューション:これらの関数を呼び出す前に、それがキーワード同期同期させることがあります。

死の評価を求める:2つの星

脳死評価:Four星

Object condition = new Object();

condition.wait();
复制代码

HashMapの無限ループ

現象:高いCPU占有、無限ループの発生、使用jstackビューは、GETメソッドでブロックされています。

理由:焼き直しは、エンドレスチェーンを形成し、一定の条件の下で。いくつかのGETリクエストは、このリングに来ます。

妹の味溶液:マルチスレッド環境、ConcurrentHashMapの使用は、躊躇しないでください。

死の評価を求める:四星

脳死評価:Four星

変数の同期に再割り当て

現象:同期効果を達成することができない、結果が間違っています。

理由:非基本タイプが再割り当てされ、ロックポイントを変更し、別のスレッドが保持しているロックが異なる場合があります。

妹の味ソリューション:ロックオブジェクトの型がfinalとして宣言されています。

死の評価を求める:四星

脳死評価:三つ星

List listeners = new ArrayList();

void add(Listener listener, boolean upsert){
    synchronized(listeners){
        List results = new ArrayList();
        for(Listener ler:listeners){
        ...
        }
        listeners = results;
    }
}
复制代码

糸ループキャッチされない例外

現象:スレッド・ジョブは終了し、未知の実行を継続することはできません。

理由:異常なサイクルは、スレッドが終了を引き起こして、トラップされていません。

妹の味ソリューション:習慣的なキャッチすべての例外。

死の評価を求める:三つ星

脳死評価:三つ星

volatile boolean run = true;
void loop(){
    while(run){
        //do . sth
        int a = 1/0;
    }
}
复制代码

カウンターと間違え揮発性

現象:マルチスレッド数が誤って行われました。

理由:揮発性、視認性を確保するためには、アトミック、マルチスレッドを保証するものではありませんし、その正確さを保証することはできません。

妹の味ソリューション:アトミッククラスを直接使用します。

死の評価を求める:三つ星

脳損傷の評価:2つ星

volatile count = 0;
void add(){
    ++count;
}
复制代码

エラー保護の範囲

現象:スレッドセーフのコレクションが、しかし、同期の効果に達していません。

操作は、複数のスレッドセーフのセットを変更することではなく、操作自体は原子ではありません:原因。

妹の風味ソリューション:論理ドメインを保護するためのコードを見つけ出します。

死の評価を求める:三つ星

脳死評価:Four星

private final ConcurrentHashMap<String,Integer> nameToNumber;
private final ConcurrentHashMap<Integer,Salary> numberToSalary;
public int geBonusFor(String name) {
    Integer serialNum = nameToNumber.get(name);
    Salary salary = numberToSalary.get(serialNum);
    return salary.getBonus();
}
复制代码

別の例は、次のエラーコードです。

Map<String, String> map = Collections.synchronizedMap(new HashMap<String, String>());

if(!map.containsKey("foo"))
    map.put("foo", "bar");
复制代码

古い日付処理クラスの一部

現象は:グローバルカレンダー、SimpleDateFormatの日付の扱いなど、異常なまたは不正確なデータを使用します。

理由:物事はスレッドセーフではありません多分、同時呼び出しは問題があるでしょう。

妹の味ソリューション:ThreadLocalのを入れて、てDateTimeFormatterスレッドセーフを使用することをお勧めします。

死のレベルを探す:スター

脳の損傷評価:1星

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

Date dododo(String str){
    return format(str);
}
复制代码

コードのデッドロック

現象:コードデッドロックとお互いを待ちます。

不可分;;リクエスト保持;サイクルを待つ排他:理由:コードは、次の4つの条件を満たしています。

妹の味ソリューション:これらの4つの条件の破壊。以下同期。

死の評価を求める:2つの星

脳の損傷評価:1星

ここでは簡単なデッドロックコードがあります。

final Object lock1 = new Object();
final Object lock2 = new Object();
new Thread(new Runnable() {
    @Override
    public void run() {
        sleep(1000);
        synchronized (lock1) {
            synchronized (lock2) {
            }
        }
    }
}).start();
new Thread(new Runnable() {
    @Override
    public void run() {
        synchronized (lock2) {
            sleep(1000);
            synchronized (lock1) {
            }
        }
    }
}).start();
复制代码

長い変数は、無効な値を読み

現象は:非セットの値を読み取ります。

上位バイトと原子を読み取るされていない別の変数に32ビット長の変数の下位32ビットは、変数を読み取ることができる:原因を。

妹の味ソリューション:longとdoubleの変数は、データが正しいことを確認するためには、あなたは、揮発性のキーワードを追加することができます。

死のレベルを探す:スター

脳損傷の評価:星なし

さらに(jdk10)読み:docs.oracle.com/javase/specを...

終わり

マルチスレッドが乗算されますAPIエラーを使用しての複雑な、低い確率の使用で、スキル要件も高くなっています。幸いなことに、同時パッケージは、このプロセスに多くの利便性が高まりますが、問題はまだ資源計画と同期失敗を存在します。ここで妹を味わうが、比較的浅い包括的な概要:JAVAマルチスレッド使用シナリオと考慮事項簡易版が、堅牢なコードも、それを実践するために、独自に依存しています。


よりエキサイティングな記事。

「マイクロサービスすべてではない、ドメイン固有のサブセットだけ」

「」サブライブラリーサブテーブル「?選択プロセスは、そうでなければ、彼らが制御不能になり、注意してください。」

そんなに監視コンポーネントは、あなたのための権利が常にあります

「Linuxの制作環境では、最も一般的に使用されるセット」vimの「スキル」

「私たちが開発に持っているもの、最後に、ネッティーを使用していますか?"

Linuxのような5個。

キャスト・アウェイ「の準備(a)の論文」「のLinuxの」

キャスト・アウェイ「(b)のCPUの記事」「のLinuxの」

キャスト・アウェイ「(C)メモリ記事」「のLinuxの」

キャスト・アウェイ「(4)I / Oの章」「のLinuxの」

キャスト・アウェイ「(e)のネットワークの記事」「のLinuxの」

注意してください。もちろん、公共の数字を心配することがあります。

おすすめ

転載: juejin.im/post/5d009e4ef265da1b7152ed90