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

标签 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() 方法。但是既然是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 方法。 任何想法为什么或为什么不应该同步 run 方法?

最佳答案

同步 Runnablerun() 方法是完全没有意义的除非你想共享 Runnable在多个线程中,您希望按顺序执行这些线程。这基本上是一个矛盾的术语。

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

关于java - 你应该同步运行方法吗?为什么或者为什么不?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7313657/

相关文章:

java - 在Android中调用Java RESTful webservice

java - 任务 ID 作为线程池中的线程名称

synchronization - OneDrive 和多个文件版本/修订版

java - 将我的本地maven存储库同步到Nexus公共(public)存储库

java - 可能使用Optional#ofNullable创建冗余对象?

Java JPA : Best practice for rollout of desktop app with DB?

java - 哪里可以免费找到 Encog 2 或用 Java 中的 Encog 3 进行神经网络编程,第二版

c++ - i7 处理器与 windows8 操作系统的多线程问题

multithreading - Scala 本地线程和 GC 问题

objective-c - 建议 : Best way to sync sqllite ios to web