web-dev-qa-db-ja.com

java syntax: "synchronized(this)"

このJavaコードの一部を説明してくれませんか?この構文を理解できません。

synchronized (this) {
              try {
                  wait(endTime - System.currentTimeMillis());
              } catch (Exception e) {
              }
}
20
user822931

つまり、このコードブロックはsynchronizedであり、そのブロック内のコードにアクセスできるスレッドは1つだけです。

また、thisは、現在のインスタンスで同期できる(現在のインスタンスでロックを取得できる)ことを意味します。

これは、Kathy SierraのJava認定書で見つけたものです。

同期は並行性を損なうため、データを保護するために必要以上のコードを同期する必要はありません。そのため、メソッドのスコープが必要以上にある場合、同期された部分のスコープを完全なメソッドではなく、単なるブロックに変換します。

次のコードスニペットを見てください。

public synchronized void doStuff() {
    System.out.println("synchronized");
}

これは次のように変更できます。

public void doStuff() {
   //do some stuff for which you do not require synchronization
   synchronized(this) {
     System.out.println("synchronized");
     // perform stuff for which you require synchronization
   }
}

2番目のスニペットでは、同期ロックはメソッド全体ではなく、そのコードブロックにのみ適用されます。

25
Abubakkar
synchronized (this)

ブロックレベルの同期を実装するための構文です。

つまり、thisオブジェクトのみで、囲まれたブロックを一度に実行できるスレッドは1つだけです。

詳細な回答については、こちらをご覧ください: ブロックレベルの同期

2
Azodious
synchronized (this) {
 }

同期ブロックと呼ばれ、同期するオブジェクトを選択できます。同期されたメソッドは 'this'(または同期されたクラスメソッドの対応するClassインスタンス)のみを使用できます
これらのリンクをご覧ください。より適切な回答が得られる可能性があります。

  1. Java同期ブロック
  2. 同期ブロックvs同期メソッド?
0
Sumit Singh

synchronized(this)-「this」を指すオブジェクトに関連付けられたロックを取得します。このブロックを使用する場合、このモニターを使用するスレッドがそれを解放するまで待機する用意があることを意味します。これは、データオブジェクト(オブジェクトの変数)を変更する場合、ロックを使用する意味があります。

wait-現在実行中のスレッドを、別のスレッドが通知メソッドを呼び出すまで、または指定された期間だけ待機させます。

0
mishka

この最初の行は、囲まれたコードブロックへの同時アクセスを制御します。一度に1つのスレッドだけがコードブロックを実行できます。詳細については、 このチュートリアル のセクション2.2をお読みください

synchronized (this) {

以下の囲まれたコードブロックは、実行スレッドを一定時間一時停止する(非常に悪い)メソッドを使用しているようです。

    try {
        wait(endTime - System.currentTimeMillis());
    } catch (Exception e) {
    }

さらに、待機中にスローされる可能性のある例外はすべて「飲み込む」ことになりますが、これは実にいたずらです。

0
Perception