Java – 同步方法导致程序大规模减速
我正在尝试了解线程和同步.我做了这个测试程序:
这个程序需要大约273秒才能完成,但如果我删除了两个同步它,它将在7秒内完成.是什么导致这种巨大的差异 编辑: 最佳答案
当你将一个静态同步放在一个方法上时,为了让一个线程执行该方法,它首先必须获取该类的锁(这里是Test).两个静态fib方法使用相同的锁.一个线程获取锁定,执行fib方法,并释放锁定,然后另一个线程获取执行该方法.哪个线程首先获得锁定取决于操作系统.
已经提到过锁是可重入的,并且递归调用synchronized方法没有问题.该线程在第一次调用fib方法时保持锁定,该调用在所有递归调用完成之前不会完成,因此该方法在线程释放锁之前运行完成. 主线程除了等待之外没有做任何事情,并且只有一个调用fib方法的线程可以一次运行.删除synchronized修饰符会加快速度,而不会锁定两个线程可以同时运行,可能使用不同的处理器. 这些方法不会修改任何共享状态,因此没有理由同步它们.即使它们确实需要同步,仍然没有理由在这里使用两个单独的fib方法,因为无论如何调用fib1或fib2方法都需要获取相同的锁. 使用synchronized without static意味着将对象实例(而不是类)用作锁.所有同步方法使用相同锁的原因是关键是保护共享状态,对象可能有各种方法来修改对象的内部状态,并且保护该状态不受并发修改的影响,应该只执行一个线程这些方法中的任何一种. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |