3

このコードを考えると:

public class Messager implements Runnable {            

  public static void main(String[] args) {   
      new Thread(new Messager("Wallace")).start();    
      new Thread(new Messager("Gromit")).start();             
  }             
  private String name;                 
  public Messager(String name) { this.name = name; }             
  public void run() {    
      message(1); message(2);    
  }           
  private synchronized void message(int n) {    
    System.out.print(name + "-" + n + " ");    
  }    
}

synchronizedキーワードがスレッドをオブジェクトのロックに依存させることを理解しています。質問:

a) メソッドが終了とマークされるとすぐにロックが解除されsynchronizedますか? または、スレッドのrun()メソッドが終了するとすぐに b) スレッドのいずれかがその名前を1 2他のスレッドの前に出力することを確認できますか?

4

1 に答える 1

2

A.はい。synchronized関数が終了するとすぐに解放されます。
B はい。できますが、そうしたいのであれば、そもそもなぜマルチスレッド コードを書くのでしょうか? synchronized順序に関しては何も保証しませんが、フラグが変更されるのを待つことで順序を強制できます。とにかく、強制しようとしているのはシーケンシャルです。これは、シングルスレッド環境で無料で入手できます:)

于 2009-12-13T18:42:35.747 に答える