0Pricing
Java Academy · レッスン

よくある並行処理のバグ

競合状態、デッドロック、可視性の問題など、よくある並行処理のバグを見つけます。

「よくある並行処理のバグ」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全3レッスンが含まれています。

導入

並行処理によって、競合状態、デッドロック、飢餓、可視性の問題などのバグが発生することがあります。

競合状態

競合状態は、スレッドの実行が予測できない順序で交互に進み、誤った結果になるときに発生します。

コード:競合状態

同期を行わないとインクリメント処理が重なり、誤ったカウントになります。

public class Main {
  private int count = 0;
  public void increment() { count++; }
  public static void main(String[] args) throws Exception {
    Main obj = new Main();
    Thread t1 = new Thread(() -> { for(int i=0;i<1000;i++) obj.increment(); });
    Thread t2 = new Thread(() -> { for(int i=0;i<1000;i++) obj.increment(); });
    t1.start(); t2.start();
    t1.join(); t2.join();
    System.out.println("Count (expected 2000) = " + obj.count);
  }
}

デッドロック

デッドロックとは、2つのスレッドがそれぞれロックを保持したまま相手のロックを待ち続け、両方が停止する状態です。

コード:デッドロック

このコードではデッドロックが発生する可能性があります。各スレッドが相手のロックを永遠に待ち続けるためです。

public class Main {
  private final Object lock1 = new Object();
  private final Object lock2 = new Object();
  public void method1() {
    synchronized(lock1) {
      try { Thread.sleep(50); } catch(Exception e) {}
      synchronized(lock2) { System.out.println("method1"); }
    }
  }
  public void method2() {
    synchronized(lock2) {
      try { Thread.sleep(50); } catch(Exception e) {}
      synchronized(lock1) { System.out.println("method2"); }
    }
  }
  public static void main(String[] args) {
    Main obj = new Main();
    new Thread(obj::method1).start();
    new Thread(obj::method2).start();
  }
}

コード:可視性の問題

volatileがないと、キャッシュが原因で、一方のスレッドがもう一方のスレッドの更新を認識できないことがあります。

public class Main {
  private static boolean flag = false;
  public static void main(String[] args) throws Exception {
    Thread writer = new Thread(() -> { flag = true; });
    Thread reader = new Thread(() -> { while(!flag) {} System.out.println("Flag seen true"); });
    writer.start(); reader.start();
    writer.join(); reader.join();
  }
}

並行処理のバグの確認

クイックチェック:2つのスレッドが互いのロックを永遠に待ち続けると、どの問題が発生しますか。

まとめ

まとめ:バグには競合状態、デッドロック、可視性の問題などがあります。同期とvolatileは、これらの問題の回避に役立ちます。

よくある質問

「よくある並行処理のバグ」レッスンは無料ですか?

はい。「よくある並行処理のバグ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全3レッスンが含まれています。

「よくある並行処理のバグ」で何を学びますか?

競合状態、デッドロック、可視性の問題など、よくある並行処理のバグを見つけます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。

「よくある並行処理のバグ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 同期とロック
  2. Atomicと並行コレクション
  3. よくある並行処理のバグ
← Java Academyに戻る