私は、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()