当前位置:嗨网首页>书籍在线阅读

29-结果分析

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

结果分析

本案例的关键就是 Account 类。本例声明 AtomicLong 类型的 balance 变量来存储账户的余额,同时声明一个 LongAdder 类型的 operations 变量来存储账户的数量,而且还声明一个 DoubleAccumulator 类型的 commission 变量来存储账户操作的值。 commission 对象的构造方法指定该值将会以 0.2*y 的形式来自增。正因如此,这可以通过 accumulate() 方法传入的参数并乘以0.2来增加变量的实际值。

为了实现返回 balance 字段的 getBalance() 方法,可以使用 AtomicLong 类的 get() 方法。为了实现返回 operationslong 型数值,用 longValue() 方法。为了实现 getCommission() 方法,可以使用 DoubleAccumulator 类的 get() 方法。为了实现设定 balance 字段的 setBalance() 方法,可以使用 AtomicLong 类的 set() 方法。

为了实现给 accountbalance 字段添加导流的 addAmount() 方法,使用可以返回其值且以指定参数进行自增的 AtomicLong 类的 getAndAdd() 方法。同时可以使用自增其值的 LongAdder 类的 increment() 方法,以及可以根据具体表达式来增加 commission 字段的 DoubleAccumulator 类的 accumulate() 方法。请注意 accountaddAmount() 方法并非是原子性的,即便其调用了3个原子性操作。

最后,为了实现减少 balance 字段的 subtractAmount() 方法,可以使用 getAndAdd() 方法。同时还应调取 LongAdder 类的 increment() 方法和 Double-Accumulator 类的 accumulate() 方法。

接下来,实现了两个不一样的任务。

  • Company 类模拟了一家公司增加其账户余额的业务。该类的每个任务都会增加10个1000。
  • Bank 类模拟了一家银行从账户中抽取资金的业务。该类的每个任务都会减少10个1000。

Main 类中,程序创建了一个带有1000 balanceAccount 类对象。然后,执行一个 bank 的任务以及一个 company 的任务,因此 accountbalance 最终值与初始值一致。

当执行该程序的时候,你会看见 balance 的最终值与初始值一致。下图展示了本案例运行的输出结果。

58.png