2 回答
TA贡献2080条经验 获得超4个赞
这句话大概是指 synchronized (accounts)
和 Vector
中方法的 intrinsic lock(锁this) 使用的锁都是实例对象本身,所以这种写法才有效,要保证使用同一个锁。
假设有两个不同的线程类A和B,都持有 accounts 的引用,线程类A启动的线程使用synchronized (accounts)
加锁进行同步,而线程类B启动的线程没有,直接使用 accounts.set
方法进行修改。
如果使用 Vector 类,A线程锁了 accounts 对象,B中调用 set
方法时,由于 set
方法使用synchronized
修饰,B也需要获取 this
,即:accounts 对象的锁,才能修改,A线程释放锁之前B线程是无法执行的。
如果使用 ArrayList 类,B不需要获取锁,直接可以进行修改,会导致状态不一致。
TA贡献1804条经验 获得超8个赞
accounts参数是通过方法调用传进来的,很难保证在进行方法调用之前,程序将accounts对象发布到了其他线程,这样就有可能有其它线程修改他了。所以作者说依赖于Vector类的同步机制。比如:
doTransfer() {
final Vector<Double> accounts = ...
new Thread(() -> {
//更改accounts并且没有进行同步
}).start()
//调用transfer
transfer(accounts .......)
}
添加回答
举报