29-结果分析
结果分析
本案例的关键就是 Account 类。本例声明 AtomicLong 类型的 balance 变量来存储账户的余额,同时声明一个 LongAdder 类型的 operations 变量来存储账户的数量,而且还声明一个 DoubleAccumulator 类型的 commission 变量来存储账户操作的值。 commission 对象的构造方法指定该值将会以 0.2*y 的形式来自增。正因如此,这可以通过 accumulate() 方法传入的参数并乘以0.2来增加变量的实际值。
为了实现返回 balance 字段的 getBalance() 方法,可以使用 AtomicLong 类的 get() 方法。为了实现返回 operations 的 long 型数值,用 longValue() 方法。为了实现 getCommission() 方法,可以使用 DoubleAccumulator 类的 get() 方法。为了实现设定 balance 字段的 setBalance() 方法,可以使用 AtomicLong 类的 set() 方法。
为了实现给 account 的 balance 字段添加导流的 addAmount() 方法,使用可以返回其值且以指定参数进行自增的 AtomicLong 类的 getAndAdd() 方法。同时可以使用自增其值的 LongAdder 类的 increment() 方法,以及可以根据具体表达式来增加 commission 字段的 DoubleAccumulator 类的 accumulate() 方法。请注意 account 的 addAmount() 方法并非是原子性的,即便其调用了3个原子性操作。
最后,为了实现减少 balance 字段的 subtractAmount() 方法,可以使用 getAndAdd() 方法。同时还应调取 LongAdder 类的 increment() 方法和 Double-Accumulator 类的 accumulate() 方法。
接下来,实现了两个不一样的任务。
Company类模拟了一家公司增加其账户余额的业务。该类的每个任务都会增加10个1000。Bank类模拟了一家银行从账户中抽取资金的业务。该类的每个任务都会减少10个1000。
在 Main 类中,程序创建了一个带有1000 balance 的 Account 类对象。然后,执行一个 bank 的任务以及一个 company 的任务,因此 account 的 balance 最终值与初始值一致。
当执行该程序的时候,你会看见 balance 的最终值与初始值一致。下图展示了本案例运行的输出结果。
