你应该同步run方法吗?为什么或者为什么不?

MHP*_*MHP 34 java multithreading synchronization synchronized runnable

我一直认为在实现Runnable的java类中同步run方法是多余的.我试图找出人们为什么这样做:

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

它似乎是多余的和不必要的,因为它们正在为另一个线程获取对象的锁.或者更确切地说,他们明确表示只有一个线程可以访问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 Code Online (Sandbox Code Playgroud)

我个人永远不会这样做,但它提出了为什么有人会同步run方法的问题.任何想法为什么或为什么不应该同步run方法?

use*_*421 32

同步a的run(方法Runnable是完全没有意义的,除非您想要Runnable在多个线程之间共享并且您想要对这些线程的执行进行顺序化.这基本上是矛盾的.

理论上还有一个更复杂的场景,你可能希望同步该run()方法,这又涉及Runnable在多个线程之间共享,但也使用wait()notify().我从未在21年多的Java中遇到过它.

  • @BenoitDuffez 然后代码应该在访问共享对象时在共享对象上同步。在整个持续时间内不在 `Runnable` 上。 (2认同)