【发布时间】:2011-03-09 17:38:53
【问题描述】:
假设我有一个类有两个方法calculateBonus(Account a) 和calculatePenalty(Account a)。
假设我在方法中添加了synchronized 关键字,或者在方法中添加了synchronized(this) 块。这是否实际上意味着如果一个线程正在计算一个帐户的奖金,在奖金完成之前其他线程无法计算另一个帐户的罚款?
罚款和奖金是多种多样且复杂的,一个帐户可能会同时收到两者。它们的计算顺序无关紧要(有一个截止日期,因此一个不会影响另一个的结果),但重要的是我不要尝试同时在同一个帐户上计算两者(对于明显的数据一致性原因,每个方法内部都会更新状态和审计跟踪信息)。
设计我的代码以便我可以安全地最大化并行处理的最佳方法是什么?
到目前为止,我已经考虑过这些选项:
1) 将计算奖励和惩罚的代码放在不同的类中,并在方法上使用synchronized 关键字。不喜欢这个想法,因为我想将一些共享的复杂函数放在一起,它们不受 IO 限制并且执行速度很快,因此不会影响性能。
2) 在传入的Account 参数上同步。如果我理解正确,这意味着在第一个线程中的第一个帐户计算奖金之前,我无法计算在另一个线程中执行的另一个帐户的奖金。但是我可以在不同的线程中计算不同帐户的罚款 - 只是不是相同帐户。我最喜欢这个,但想确保我理解正确。
3) 为我要同步的每个方法创建一个内部私有锁对象,一个用于奖励,一个用于惩罚。如果理解正确,这意味着一次只能有一个线程计算奖金,但它不会阻止另一个线程同时计算 同一个帐户的罚金时间。
现在我明白我必须小心避免死锁,我计划确保任何同步块中的任何内容都不会依赖于对其他同步方法的调用。我还打算确保影响最终值的计算中使用的任何局部变量都在同步块内。
【问题讨论】:
标签: java concurrency synchronization parallel-processing