您应该同步运行方法吗?为什么或者为什么不?

MHP:

我一直认为,在实现Runnable的java类中同步run方法是多余的。我试图弄清楚为什么人们这样做:

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

这似乎是多余且不必要的,因为它们正在为另一个线程获取对象的锁。更确切地说,他们明确表示只有一个线程可以访问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方法。有什么想法为什么或为什么不应该同步运行方法?

洛恩侯爵:

同步a的run()方法Runnable是完全没有意义的,除非您要Runnable在多个线程之间共享,并且希望按顺序执行这些线程。基本上这是一个矛盾。

从理论上讲,还有另一种更为复杂的场景,您可能需要同步该run()方法,该场景再次涉及Runnable在多个线程之间共享,但也使用wait()notify()我有21年以上的Java经验,从未见过。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

开发WUBI很难吗?为什么或者为什么不?

您/您的公司是否使用 React Material-ui?为什么或者为什么不?

为什么“是”方法不运行?

对象可以在OOP中定义新的同级或子类吗?为什么或者为什么不?

为什么@Override方法不运行?

具有@Value注释和单个方法的字段。我应该让它们都静止吗?为什么/为什么不呢?

为什么ssh-agent运行?应该是吗?

为什么这样不运行?

为什么同步块比同步方法更好?

为什么仍然存在“命令不同步;您现在无法运行此命令”错误

为什么我的Deferred不运行错误方法?

为什么 asyncio.create_task 不运行该方法?

我应该总是在多线程编程中锁定全局数据吗,为什么或为什么不呢?

为什么抽象方法无法同步?

JS:为什么 Promise then() 方法是同步执行的?

为什么同步方法不起作用?

为什么 Observable 类中的方法是同步的?

快速简便:为什么不运行?

为什么这个循环不运行“if 语句”?

为什么转换器不运行?

为什么不运行SQL查询?

为什么异步/等待不异步运行?

为什么此switch语句不运行?

为什么不运行Javascript代码?

Java 8流,为什么要编译第2部分...或者什么是方法参考,真的吗?

为什么String类的构造方法与参数的StringBuffer使用同步块,而与StringBuilder的构造不?

您为什么不应该在Composer上运行Kubernetes Pod超过一个小时呢?

为什么这个方法会消耗这么多内存?或者更确切地说,为什么 GC 不释放内存?

为什么ContentResolver.requestSync不触发同步?