0

コードまたはインスタンスのブロックを同期ブロックに入れることができることを知っています。したがって、次の短い例を考えてみましょう。

public class SynchronizedObject {   
    public static void main(String args){
        System.out.println(" 1 " );

        synchronized(args){     
            //do stuff  
        }

この場合、引数はインスタンスですよね? そして、このインスタンスもオブジェクトですか? どのような状況でも、変数またはローカル変数を同期ブロックに入れることはできませんか?

4

2 に答える 2

3

あなたの質問は不明確です。あなたはブロックとステートメントを混ぜているようです:

  • あなたの例では、同期されたブロックは中括弧の内側にあるものであるため、その//do stuff部分です。
  • args、あなたの例では、synchronizedステートメントによって使用されるロックです。

あなたはおそらくチュートリアルを読むことから利益を得るでしょう。

同期ブロック内に何を入れることができますか?

有効なJavaステートメントである限り、必要なものは何でも。

argsはインスタンスです私は正しいですか?

argsはのインスタンスへの参照ですString(おそらくあなたが意味しているのですがString[])。

このインスタンスもオブジェクトですか?

そうですね、クラスのインスタンスはオブジェクトです。

いかなる状況でも、変数またはローカル変数を同期ブロックに入れることはできませんか?

ブロック内では、上で説明したように、やりたいことができます。キーワード(ロック)への引数synchronizedは、オブジェクトのnull以外のインスタンスへの参照である必要があります。必要に応じて、これはローカル変数にすることができます(ただし、目標を達成できない可能性があります)。

于 2013-02-27T17:05:51.077 に答える
2

この場合argsはローカル変数であり、そのStringクラスのインスタンスです。そしてString確かに、ObjectJavaのすべてのクラスはから派生しているのでObject

ローカル変数を同期ブロックに配置することに制限はありません。それを実行することで得られるものはそれほど多くありませんが、制限もありません。

ただし、ローカル変数で同期しても、有用なものは何も得られません。

于 2013-02-27T17:08:48.250 に答える