Java – 同步方法导致程序大规模减速

前端之家收集整理的这篇文章主要介绍了Java – 同步方法导致程序大规模减速前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试了解线程和同步.我做了这个测试程序:

public class Test {
    static List

这个程序需要大约273秒才能完成,但如果我删除了两个同步它,它将在7秒内完成.是什么导致这种巨大的差异

编辑:
我知道我正在使用一种非常慢的算法来计算斐波纳契数.而且我也知道线程不共享资源,因此这些方法不需要同步.然而,这只是一个测试程序,我试图弄清楚同步是如何工作的,我选择了一个慢速算法,所以我可以测量所用的时间,以毫秒为单位.

最佳答案
当你将一个静态同步放在一个方法上时,为了让一个线程执行该方法,它首先必须获取该类的锁(这里是Test).两个静态fib方法使用相同的锁.一个线程获取锁定,执行fib方法,并释放锁定,然后另一个线程获取执行该方法.哪个线程首先获得锁定取决于操作系统.

已经提到过锁是可重入的,并且递归调用synchronized方法没有问题.该线程在第一次调用fib方法时保持锁定,该调用在所有递归调用完成之前不会完成,因此该方法在线程释放锁之前运行完成.

主线程除了等待之外没有做任何事情,并且只有一个调用fib方法的线程可以一次运行.删除synchronized修饰符会加快速度,而不会锁定两个线程可以同时运行,可能使用不同的处理器.

这些方法不会修改任何共享状态,因此没有理由同步它们.即使它们确实需要同步,仍然没有理由在这里使用两个单独的fib方法,因为无论如何调用fib1或fib2方法都需要获取相同的锁.

使用synchronized without static意味着将对象实例(而不是类)用作锁.所有同步方法使用相同锁的原因是关键是保护共享状态,对象可能有各种方法修改对象的内部状态,并且保护该状态不受并发修改的影响,应该只执行一个线程这些方法中的任何一种.

猜你在找的Java相关文章