Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのwait()とsleep()の違いを徹底解説!ロック解放や起床条件の違いを比較

Javaのマルチスレッドプログラミングにおいて、wait()sleep()はどちらもスレッドの実行を一時停止させるメソッドですが、その動作には重要な違いがあります。本記事では、それぞれのメソッドの特徴を解説し、5つの観点から両者を比較します。

wait()メソッドとは

wait()メソッドを呼び出すと、スレッドは現在保持しているモニター(ロック)の所有権を解放し、待機状態に入ります。その後、別のスレッドが同じオブジェクトのモニターに対してnotify()またはnotifyAll()メソッドを呼び出すことで、待機中のスレッドが起床されます。起床後も、スレッドはモニターの所有権を再取得できるまで待機し続け、取得できた時点で実行を再開します。

sleep()メソッドとは

sleep()メソッドは、現在実行中のスレッドを指定されたミリ秒数の間だけスリープ(一時的に実行を停止)させます。このとき、スレッドは保持しているモニターの所有権を失いません。つまり、他のスレッドが同じロックを取得することはできません。sleep()は、現在のスレッドを一定時間だけ「Not Runnable(実行不可能)」状態に遷移させるメソッドです。

wait()とsleep()の比較表

No.比較項目wait()sleep()
1 所属クラス Objectクラスに属する Threadクラスに属する
2 ロックの解放 オブジェクトのロックを解放する ロックを解放しない
3 呼び出し方法 同期ブロック内でオブジェクトに対して呼び出す Threadクラスの静的メソッドとして呼び出す
4 起床条件 notify()またはnotifyAll()が呼ばれるまで待機 指定時間の経過、またはinterrupt()の呼び出しまで待機
5 スプリアスウェイクアップ 発生する可能性があるため、whileループでの再チェックが推奨される 発生しない

wait()とsleep()のコード例

以下は、同期ブロック内でwait()sleep()を使用する例です。

synchronized(lockedObject){
    while(condition == true){
        lockedObject.wait(); // lockedObjectのロックを解放して待機
    }
    Thread.sleep(100); // 現在のスレッドを100ミリ秒間スリープさせる
}

この例では、条件が満たされている間はwait()によってロックを解放しながら待機し、他のスレッドからの通知を待ちます。一方、Thread.sleep(100)はロックを保持したまま、現在のスレッドを指定時間だけ停止させます。

まとめ

wait()はスレッド間通信のためのメカニズムであり、ロックを解放して他のスレッドに処理の機会を与えるのに対し、sleep()は単純に時間経過による一時停止を行い、ロックは保持し続けます。用途に応じて適切なメソッドを選択することが、デッドロックや競合状態を防ぐ上で非常に重要です。

  1. JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介

    HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って

  2. Javaのwait()メソッドとsleep()メソッドの違いを徹底解説

    Javaのマルチスレッドプログラミングでは、sleep()メソッドとwait()メソッドのどちらもスレッドの処理を一時停止させるために使用されますが、両者にはいくつかの重要な違いがあります。本記事では、それぞれの特徴と相違点をわかりやすく解説します。 sleep()メソッドとwait()メソッドの主な違い 1. メソッドの種類と影響範囲 sleep()メソッドはThreadクラスのstatic(静的)メソッドであり、呼び出すと現在実行中のスレッドを「実行不可能(Non-Runnable)」状態にします。 一方、wait()メソッドはインスタンスメソッドであり、スレッドオブジェクトではなく対象の