使大型Java非静态方法同步有什么缺点?从某种意义上讲,大型方法需要1到2分钟才能完成执行。
答案 0 :(得分:17)
如果同步方法并尝试同时调用它两次,则一个线程必须等待两分钟。
这不是一个“缺点”的问题。根据方法的不同,同步或不同步。
如果代码同时运行一次至关重要,那么您需要同步。
如果您只想同时运行一次代码以保留系统资源,您可能需要考虑计数Semaphore,这样可以提供更大的灵活性(例如能够配置并发执行的数量) )。
另一个有趣的方面是同步只能用于控制对同一JVM内资源的访问。如果您有多个JVM并且需要同步对共享文件系统或数据库的访问,则synchronized关键字根本不够用。您将需要获得外部(全局)锁定。
答案 1 :(得分:4)
如果该方法需要几分钟的时间来执行,那么它可能不需要在如此粗略的级别上同步,并且可能使用更细粒度的系统,可能通过仅锁定部分此方法正在运行的数据结构。当然,您应该尝试确保您的关键部分实际上不是2分钟 - 任何花费很长时间执行的方法(无论是否存在其他线程或锁)都应该作为并行化的候选者进行仔细研究。对于耗时的计算,您可以获取并释放数百个锁,但仍然可以忽略不计。 (或者,换句话说,即使您需要引入大量锁来并行化此代码,开销可能也不会很大。)
答案 2 :(得分:2)
由于您的方法需要花费大量时间才能运行,因此获取同步锁所花费的时间相对较少并不重要。
如果您的程序是多线程的(我假设它是,因为您正在使方法同步),并且多个线程需要访问该方法,则可能会出现更大的问题,它可能会成为瓶颈。为了防止这种情况,您可以重写方法以使其不需要同步,或使用synchronized块来减小受保护代码的大小(通常,由synchronize关键字保护的代码量越小, 更好)。
您还可以查看java.util.concurrent classes,因为您可以在那里找到更好的解决方案。
答案 3 :(得分:1)
如果对象由多个线程共享,如果一个线程尝试在对象上调用synchronized方法而另一个线程正在进行调用,则它将被阻塞1到2分钟。在最糟糕的情况下,您可能会遇到瓶颈,系统的吞吐量主要通过一次执行这些计算来控制。
这是否有问题取决于您的应用程序的详细信息,但您可能应该考虑更细粒度的同步......如果这是可行的。
答案 4 :(得分:0)
在简单的两行中,Java中同步方法的缺点:
- 增加线程的等待时间
- 造成性能问题
答案 5 :(得分:0)
在简单的两行中,Java中同步方法的缺点:
1. Increase the waiting time of the thread
2. Create a performance problem
答案 6 :(得分:0)
第一个缺点是等待执行同步代码的被阻塞线程不会被中断。一旦被阻塞,它们被卡住,直到它们获得了要同步代码的对象的锁。
第二个缺点是同步块必须在同一方法内,换句话说,由于明显的原因,我们不能以一种方法开始同步块,而以另一种方法结束同步块。
第三个缺点是,我们无法测试对象的内部锁是否可用,或者无法找到有关该锁的其他信息,如果该锁不可用,我们就无法在等待锁之后等待超时。而。当我们到达同步块的开头时,我们可以获取锁并继续执行,或者在该行代码处进行阻塞,直到获得锁为止。
第四个缺点是,如果多个线程正在等待获取锁,则不是先到先服务。 JVM没有选择要获取锁的下一个线程的顺序,因此被阻塞的第一个线程可能是获取锁的最后一个线程,反之亦然。
因此,我们可以使用实现java.util.concurrent locks.lock接口的类来防止线程干扰,而不是使用同步。