我正在尝试了解线程和同步.我做了这个测试程序:
public class Test {
static List
这个程序需要大约273秒才能完成,但如果我删除了两个同步它,它将在7秒内完成.是什么导致这种巨大的差异
编辑:
我知道我正在使用一种非常慢的算法来计算斐波纳契数.而且我也知道线程不共享资源,因此这些方法不需要同步.然而,这只是一个测试程序,我试图弄清楚同步是如何工作的,我选择了一个慢速算法,所以我可以测量所用的时间,以毫秒为单位.
最佳答案
当你将一个静态同步放在一个方法上时,为了让一个线程执行该方法,它首先必须获取该类的锁(这里是Test).两个静态fib方法使用相同的锁.一个线程获取锁定,执行fib方法,并释放锁定,然后另一个线程获取执行该方法.哪个线程首先获得锁定取决于操作系统.
原文链接:https://www.f2er.com/java/437265.html已经提到过锁是可重入的,并且递归调用synchronized方法没有问题.该线程在第一次调用fib方法时保持锁定,该调用在所有递归调用完成之前不会完成,因此该方法在线程释放锁之前运行完成.
主线程除了等待之外没有做任何事情,并且只有一个调用fib方法的线程可以一次运行.删除synchronized修饰符会加快速度,而不会锁定两个线程可以同时运行,可能使用不同的处理器.
这些方法不会修改任何共享状态,因此没有理由同步它们.即使它们确实需要同步,仍然没有理由在这里使用两个单独的fib方法,因为无论如何调用fib1或fib2方法都需要获取相同的锁.
使用synchronized without static意味着将对象实例(而不是类)用作锁.所有同步方法使用相同锁的原因是关键是保护共享状态,对象可能有各种方法来修改对象的内部状态,并且保护该状态不受并发修改的影响,应该只执行一个线程这些方法中的任何一种.