【问题标题】:Multiple Threads Sharing the same function simultaneously多个线程同时共享同一个函数
【发布时间】:2013-09-17 01:49:59
【问题描述】:

如果我们创建例如 3 个线程 T1、T2 和 T3,它们每个都调用相同的函数或过程,那么如果我们调用它们一段时间 T1.start() T2.start() T3.start() 是否有效?或者我们需要同步它们??

【问题讨论】:

    标签: java multithreading thread-safety


    【解决方案1】:

    您不同步函数,而是同步它们对资源的访问。

    如果任何函数修改了公共资源 *,而其他函数需要访问它,无论是读取还是写入,您都需要同步对资源的访问。否则,无需添加同步。


    *resource 可以是成员变量、静态或非静态、内存中的对象、操作系统对象(如文件或套接字)、集合以及很快。

    【讨论】:

    • 我有一个Vector,我正在考虑创建 5 个Threads,它们同时向Vector 添加元素,所以我想我的想法不可行??
    • @GhassenBellagha 添加到向量会使集合无效,所以你是对的,你不能在没有同步的情况下使用向量。如果您打算仅在向量末尾添加元素,则可以使用 BlockingQueue<T> 而无需额外同步。
    • 所以在这种情况下不需要Threads,我的意思是我可以调用普通函数而不是Threads,因为它似乎给出了相同的结果!?即使使用BlockingQueue<T> Threads 也不会并行工作,因此它与指令后的工作指令相同.. ?
    • @GhassenBellagha 当然线程可以并行工作。只有写作不会并行进行,但其他一切都会。考虑一下:您有五个线程读取文件、构造对象并将它们添加到队列中。读取文件和构造对象将并行进行;添加到队列中会阻塞。另一个线程可能正在从该队列的另一端读取数据,从而阻止数据变得可用。它也会与其他线程并行工作。
    • 请注意,java.util.Vector 已经同步,对于写入同一个Vector 的多个线程,不需要额外同步。
    【解决方案2】:

    仅当您在不同线程中读取/写入相同的变量(状态)时,才需要同步。如果方法仅使用局部变量 - 您不需要同步它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-14
      • 2016-05-03
      • 2011-05-21
      • 2013-06-22
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      相关资源
      最近更新 更多