《Java核心技术第九版 卷I》的14.5.6 Synchronized Blocks一节有一段代码:
public void transfer(Vector<Double> accounts, int from, int to, int amount) {
synchronized (accounts) {
accounts.set(from, accounts.get(from) - amount);
accounts.set(to, accounts.get(to) + amount);
}
System.out.println(. . .);
}
这段代码是模拟银行转账的,当多个线程并发地进行转账时,如果不进行同步就会导致账户中的数据出现不一致的情况。所以书里给这段代码加了synchronized同步。
但是书中这段程序后面还有一句话:
This approach works, but it is entirely dependent on the fact that the Vector class uses the intrinsic lock for all of its mutator methods.
(加了同步之后)这就没问题了,但是这段代码完全依赖于Vector类是否使用它自己的锁来同步它的修改方法。
问题来了,为什么这样写还要依赖于Vector是否加锁,以及加锁方式呢?我认为不管Vector是否是同步的这段代码都没问题。我实际测试了,将Vector换成非同步的ArrayList,确实没有任何问题!不知道作者为什么这样说,难道是我哪里理解的不对?
犯罪嫌疑人X
胡说叔叔
相关分类