私はいくつかの通知/待機の例を見ていて、これを見つけました。私は同期ブロックが本質的にクリティカルセクションを定義していることを理解していますが、これは競合状態を示していませんか?どの同期ブロックが最初に入力されるかは指定しません。ウェブサイトごとにこの例で競合状態はありますか?もしそうなら、どのように避けることができますか?
public class ThreadA {
public static void main(String[] args){
ThreadB b = new ThreadB();
b.start();
synchronized(b){
try{
System.out.println("Waiting for b to complete...");
b.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread {
int total;
@Override
public void run(){
synchronized(this){
for(int i=0; i<100 ; i++){
total += i;
}
notify();
}
}
}
出力:
完了するためにBを待っています...
合計は以下のとおりです。はい、それは競合状態4950
はい、理論的には、メインスレッドが 'wait()'を呼び出す前に、新しいスレッドが 'notify()'することができました。 – overthink
'synchronized'ブロックは競合を防止するとは考えないでください。それは単にレースの_スコープ_を制限するだけです。それは、トラックがお互いを追い越すには狭すぎる車である自動車レースコースのセクションのようなものです。彼らはまだレースをしていますが、その1つのセクションを1つのファイルで処理する必要があります。 'synchronized'ブロックでも同じことが言えます:スレッドはここではレース中ではありませんが、ここで_getに競合し、他のレースで競合します。 –
@jameslargeそれは素晴らしいアナロジーでした! 2つのスレッドは同期ブロックに同時に存在することはできませんが、明示的に指定されない限り、最初に誰がそこに到達する可能性がありますか? – trevalexandro