代码之家  ›  专栏  ›  技术社区  ›  Madhu

Java中同步方法的缺点

  •  3
  • Madhu  · 技术社区  · 17 年前

    使大型Java非静态方法同步的缺点是什么?大型方法,即完成执行需要1到2分钟。

    6 回复  |  直到 17 年前
        1
  •  17
  •   Thilo    17 年前

    如果同步该方法并尝试同时调用它两次,则一个线程必须等待两分钟。

    这不是一个真正的“劣势”问题。是否需要同步,取决于方法的功能。

    如果希望同时运行代码只保存一次系统资源,则可能需要考虑计数。 Semaphore ,这提供了更大的灵活性(例如能够配置并发执行的数量)。

        2
  •  4
  •   user57368    17 年前

    如果该方法的执行时间为分钟,则可能不需要在如此粗略的级别对其进行同步,并且可以使用更细粒度的系统,可能只锁定该方法当前正在操作的数据结构的部分。当然,您应该尝试确保您的关键部分不是真正的2分钟长-任何需要那么长时间执行的方法(无论是否存在其他线程或锁)都应该仔细研究,作为并行化的候选方法。对于如此耗时的计算,您可能会获取和释放数百个锁,但仍然可以忽略不计。(或者,换一种说法,即使您需要引入大量锁来并行化此代码,开销可能不会很大。)

        3
  •  2
  •   Peter Recore    17 年前

    由于您的方法需要大量的时间来运行,因此获取同步锁所需的相对较少的时间应该不重要。

    您还可以查看java.util.concurrent classes ,因为您可能会在那里找到更好的解决方案。

        4
  •  1
  •   Stephen C    17 年前

    如果对象由多个线程共享,如果一个线程试图在另一个线程调用对象时调用该对象上的synchronized方法,则该对象将被阻止1到2分钟。在最坏的情况下,您可能会遇到瓶颈,系统的吞吐量主要由一次执行一个计算来控制。

        5
  •  0
  •   user10314212 user10314212    7 年前

    在简单的两行中,Java中同步方法的缺点是:

    1. 增加线程的等待时间
        6
  •  0
  •   Yash Patel    6 年前

    第一个缺点是,在等待执行同步代码时被阻止的线程不能被中断。一旦被阻止,它们的线程就会被卡住,直到它们获得代码同步对象的锁为止。

    第三个缺点是,我们无法测试对象的内在锁是否可用,也无法找出关于锁的任何其他信息。如果锁不可用,我们也无法在等待锁一段时间后超时。当我们到达一个同步块的开头时,我们可以获得锁并继续执行,或者在该行代码处阻塞,直到获得锁为止。

    第四个缺点是,如果多个线程正在等待获得锁,则不是先到先得。JVM选择下一个获得锁的线程的顺序没有设置,因此第一个被阻止的线程可能是最后一个获得锁的线程,反之亦然。

        7
  •  -1
  •   Swapnil G Thaware    7 年前

    在简单的两行中,Java中同步方法的缺点是:

     1. Increase the waiting time of the thread
     2. Create a performance problem