java 使用非依赖属性实现同步

写这个例子的时候我还是有很多疑问的。虽然结果是正确的实现了同步,但是我不太明白为什么要这样写。

 

一、实践

假设有一家银行,有2台atm,提供存取款服务。其中amt1只能存取账户a的金额,atm2只能存取账户b的金额。使用多线程实现这一场景。

1.实现思路

首先存在两个对象,一个是Bank,一个是atm。因为atm提供存取款服务,所以atm类需要实现Runnable接口。

atm1存取款修改的是账户a中的金额,所以Bank中应该有一个moneyA的字段,代表账户a的金额。atm2同理。

在atm类使用存取款的功能,实际上使用的是银行提供的金额加减的功能,也就是说atm类需要调用Bank类提供的金额加减的方法。因为有两个不同的账户,所以需要提供两套不同的方法,对两个不同的账户进行操作。

atm需要调用Bank类的方法,所以需要在atm类中写一个构造方法传入Bank类。

因为设涉及并发,所以需要使用synchronized关键字。

2.代码实现

这里有几个需要理解的地方:

(1)atm是一类东西,所以实现一个atm类,创建两个对象就可以了。这里是因为需要模拟两台atm的真实操作(可以看见调用的方法是不同的),所以需要创建两个不同的atm类。

(2)Bank类中设置了两个对象:

并且在构造方法中进行了实例化:

然后在对不同的两个账户进行操作时,把对象加入到synchronized代码块中:

似乎是实现了一个锁的功能,保证了方法的同步,那么问题来了,如果我这里换成this:

结果也是一样的,那为什么我非要在这里传入一个对象?这是我不理解的地方…

二、总结

感觉还是有些不理解…

发表评论

电子邮件地址不会被公开。 必填项已用*标注