1

synchronized次の例からキーワードを理解しようとしています

JavaMainメソッド -->

public int methodA(){

  Hello h = new Hello();
  h.callSomeSynchronizedMethod();    

  sysout("Main");
  return 0;    

}

Hello授業中-->

public synchronized void callSomeSynchronizedMethod(){
   Hi h = new Hi();

   h.someMethod();

   sysout("Hello");

}

Hiクラスで

public void someMethod(){

    sysout("Hi");
}

それで、私が得る出力のリストは何でしょうか;

1.) の順番Hi, Hello and Mainですか?

2.) synchronized キーワードについて私が理解していることは、マルチスレッドなしで、1 つのメソッドのみを実行し、次に他のメソッドを実行するということです。これは正しいです ?

4

4 に答える 4

1

はい、「こんにちは」、「こんにちは」、「メイン」の順になります。同期された修飾子は、メソッドが呼び出される順序とは関係ありません。また、少しのオーバーヘッドを追加する以外は、シングルスレッドでコードを実行する場合は何もしません。同期せずにこの同じテストを実行して、同じ結果を得ることができます。

ここで、複数のスレッドがこれらのメソッドを呼び出している同様のテストを実行した場合、結果はそれほど明確ではありません。

Synchronizedは、マルチスレッド環境でコードをより安全に実行し、リソースを管理できるようにすることを目的としています。

http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

お役に立てれば。

于 2012-12-19T13:18:52.850 に答える
1

何が同期されているかを本当に理解するには、プログラムを 2 回実行する必要があります。また、プログラムは複数のスレッドを使用する必要があります。ここにそのようなテストの例を示します。

public class Synchro {

    public static void main(String args[]){
        new Synchro();
    }

    public Synchro(){
        final Moo moo = new Moo();
        Thread t = new Thread(new Runnable(){
           public void run(){
               moo.aMethod("Second");
           }
        });
        t.start();//calling the method in a thread

        moo.aMethod("First");//calling the same method from the same object in the main thread
     }

 class Moo{     
    public Moo(){            
    }

    public void aMethod(String name){
        //this loop just prints slowly so you can see the execution
        for(int i = 1; i <= 100; i++){
            System.out.println(String.format("%s : %d", name, i));
            try{
                Thread.sleep(50);
            }catch(InterruptedException e){}
        }
    }
  }

}

ここで、上記のコードを実行すると、メソッドが同期されていないことに気付き、メソッドの 2 つの実行がインターリーブされて出力されます。つまり、First 1、Second 1、First 2 などと表示されます。

ここで、synchronized キーワードをメソッドに追加して、次のようにします。

  public synchronized void aMethod(String name){ ....

コードを再度実行します。今回は、メソッドの 1 つの実行が完了してから、別の実行が開始されます。

synchronized キーワードは、複数のスレッドがまったく同じオブジェクトにアクセスしている場合にのみ必要です。

于 2012-12-19T13:24:56.837 に答える
0

これらのメソッドはすべて1つのスレッドで実行されるため、最初の質問の答えは「はい」です。

synchronizedキーワードは、メソッドが常に1つのスレッドでのみ実行できることを意味します。したがって、別のスレッドから呼び出すと、最初のスレッドで実行が終了するまで待機します。

于 2012-12-19T13:18:30.360 に答える
0

Javaには自動マルチスレッドはありません。スレッドを明示的に開始し、run実行するメソッドを渡す必要があります。その場合にのみ、synchronizedキーワードが重要になりますが、その意味は理解しているとおりではありません。メソッドは、メソッドを呼び出すスレッドで実行されますが、実行中は、メソッドを実行する前に別のスレッドがブロックされます。同じロックで守られています。

于 2012-12-19T13:22:47.940 に答える