我决定在实现所需点的线程安全(同步)的同时实现高性能增益的最佳方法是什么。
考虑以下情况。系统中有两个入口点,我想确保同时没有两个或更多线程更新cashAccounts
和itemStore
。所以我创建了一个Object调用Lock
并按如下方式使用它。
public class ForwardPath {
public void fdWay(){
synchronized (Lock.class){
//here I am updating both cashAccount object and
//itemStore object
}
}
}
public class BackWardPath {
public void bwdWay(){
synchronized (Lock.class){
//here I am updating both cashAccount object and
//itemStore object
}
}
}
但如果频繁触发ForwardPath
和BackWardPath
,则此实施会大大降低性能。
但是在这种情况下,只有很难锁定cashAccount
和itemStore
,因为这两个对象在两个路径中都会多次更新。
在这种情况下,有没有一种方法可以实现性能提升和线程安全?
答案 0 :(得分:1)
这个例子太抽象了,你所描述的那个很少,在方法中没有无法替代同步。
为了获得高可扩展性(在所有情况下不必然最高表现,请注意),工作通常细分为完全独立于彼此的工作单元(这些可以在没有任何同步的情况下进行处理)。
让我们假设一个简单的例子,总结数字(纯粹是为了证明原理):
天真的解决方案是为总和设置一个累加器,然后将数字添加到累加器中。显然,如果你想使用多个线程,那么累加器需要同步并成为 主要争用点。)
要消除争用,您可以将数字划分为多个切片 - 单独的工作单元。每个工作单元可以独立求和(例如,每个工作单元一个线程)。要获得最终总和,请将每个工作单元的部分总和相加。现在需要同步的唯一一点是组合部分结果。如果你有100亿个数字,并将它们分成10个单位的工作,你只需要同步10次 - 而不是100亿次在天真的解决方案。
这里的原则总是一样的:确保你可以在没有同步的情况下做尽可能多的工作,然后结合部分结果来获得最终结果。对个体操作水平的思考是细化粒度以适应多线程。
答案 1 :(得分:0)
使用Threads获得性能是一个架构问题,只需添加一些Threads和synchronized就不会起作用,而且通常只是搞砸你的代码,而不是比以前更快地工作。因此,您的代码示例不足以帮助您解决您似乎面临的实际问题,因为每个线程解决方案对您的实际代码都是唯一的。