このJavaコードを教えてください。この構文が理解できません。
synchronized (this) {
try {
wait(endTime - System.currentTimeMillis());
} catch (Exception e) {
}
}
このJavaコードを教えてください。この構文が理解できません。
synchronized (this) {
try {
wait(endTime - System.currentTimeMillis());
} catch (Exception e) {
}
}
これは、このコード ブロックが、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 番目のスニペットでは、メソッド全体ではなく、そのコード ブロックにのみ同期ロックが適用されます。
synchronized (this)
ブロックレベルの同期を実装するための構文です。
これは、this
オブジェクトに対してのみ、一度に 1 つのスレッドのみが囲まれたブロックを実行できることを意味します。
詳細な回答については、こちらを参照してください:ブロック レベルの同期
この最初の行は、囲まれたコード ブロックへの同時アクセスを制御します。コード ブロックを一度に実行できるのは、一度に 1 つのスレッドだけです。詳細については、このチュートリアルのセクション 2.2 をお読みください。
synchronized (this) {
以下に含まれるコード ブロックは、実行スレッドを一定時間一時停止する (非常に貧弱な) メソッドを使用しているようです。
try {
wait(endTime - System.currentTimeMillis());
} catch (Exception e) {
}
さらに、待機中にスローされる可能性のある例外を「飲み込む」ことは、実際には非常にいたずらです。
synchronized(this) - 「this」を指すオブジェクトに関連付けられたロックを取得します。このブロックを使用するときは、このモニターを使用しているスレッドが解放するまで待機することを意味します。これは、データ オブジェクト (オブジェクトの変数) を変更する場合、ロックを使用する意味があります。
wait - 別のスレッドが通知メソッドを呼び出すまで、または指定された期間、現在実行中のスレッドを待機させます。
synchronized (this) {
}
これは同期ブロックと呼ばれ、同期するオブジェクトを選択できます。同期されたメソッドは「これ」(または同期されたクラスメソッドの対応するクラスインスタンス)のみを使用できます
。これらのリンクを見て、より良い答えが得られるかもしれません。