実行メソッドを同期する必要がありますか? その理由は何ですか? 質問する

実行メソッドを同期する必要がありますか? その理由は何ですか? 質問する

私は、Runnable を実装する Java クラスで run メソッドを同期するのは冗長だと常に思っていました。なぜ人々がこのようなことをするのか理解しようとしています。

public class ThreadedClass implements Runnable{
    //other stuff
    public synchronized void run(){
        while(true)
             //do some stuff in a thread
        }
    }
}

別のスレッドのためにオブジェクトのロックを取得しているので、冗長で不必要に思えます。 むしろ、1 つのスレッドだけが run() メソッドにアクセスできることを明示的に示しています。 しかし、run メソッドなので、それ自体が独自のスレッドではないでしょうか? したがって、それ自体だけがアクセスでき、別のロック メカニズムは必要ありませんか?

オンラインで、run メソッドを同期することで、たとえば次のようにして事実上のスレッド キューを作成できる可能性があるという提案を見つけました。

 public void createThreadQueue(){
    ThreadedClass a = new ThreadedClass();
    new Thread(a, "First one").start();
    new Thread(a, "Second one, waiting on the first one").start();
    new Thread(a, "Third one, waiting on the other two...").start();
 }

私は個人的には決してそんなことはしませんが、なぜ run メソッドを同期するのかという疑問が生じます。実行メソッドを同期する必要がある理由、または同期しない理由について何かアイデアはありますか?

ベストアンサー1

run()メソッドを同期することはRunnable全く意味がありませんない限りRunnable複数のスレッド間で共有したいそしてこれらのスレッドの実行を順次化したいのですが、これは基本的に矛盾した言葉です。

理論上は、メソッドを同期したいという、はるかに複雑なシナリオがもう 1 つあります。run()この場合も、複数のスレッド間で を共有するだけでなく、とRunnableも使用します。私は 21 年以上 Java を使ってきましたが、このような状況に遭遇したことはありません。wait()notify()

おすすめ記事