当前位置: 首页 > 面试题库 >

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

太叔景同
2023-03-14
问题内容

我一直认为,在实现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经验,从未见过。



 类似资料:
  • 问题内容: 我已经开始学习线程同步。 同步方法: 同步块: 什么时候应该使用方法和块? 为什么块比方法更好? 问题答案: 这不是更好的问题,只是有所不同。 同步方法时,实际上是在与对象本身进行同步。对于静态方法,您正在同步到对象的类。因此,以下两段代码以相同的方式执行: 就像您写的一样。 如果要控制到特定对象的同步,或者只想将方法的 一部分 同步到该对象,则指定一个块。如果在方法声明上使用关键字,

  • 问题内容: 我在同一文件中有以下程序。我已经同步了run()方法。 输出是 我的问题是,为什么同步方法同时允许“我的线程1”和“我的线程4”线程访问? 问题答案: 方法在实例级别工作。 类的每个实例都有自己的锁。每次输入实例的任何方法都将获取该锁。这样可以防止多个线程 在同一个实例上 调用方法(请注意,这还可以防止在同一个实例上调用 不同的 方法)。 现在,由于您有两个类实例,因此每个实例都有自己

  • 问题内容: 我指的是此处提出的问题,并使用作者代码示例,现在我的问题是 作者为什么要使用,真的有必要吗,因为syncedMap始终会确保没有两个线程试图对其进行操作,那么为什么需要在该地图本身上进行操作呢? 非常感谢您的解释。 问题答案: 为什么我们需要对其本身进行同步? 您可能需要在一个已经同步的集合上进行同步,因为您正在对该集合执行两个操作-在您的示例中,是a 然后是a。您试图在 _调用_集合

  • 我的老师让我这样做,但在评论区我被告知我不应该这样做。 为什么?

  • Java中,任何对象都可以作为锁,并且 wait(),notify()等方法用于等待对象的锁或者唤醒线程,在 Java 的线程中并没有可供任何对象使用的锁,所以任意对象调用方法一定定义在Object类中。 wait(), notify()和 notifyAll()这些方法在同步代码块中调用 有的人会说,既然是线程放弃对象锁,那也可以把wait()定义在Thread类里面啊,新定义的线程继承于Thr