这几天,我正在阅读 Core Java 一书, 当我阅读并发一章时,我很困惑。有一个同步块的例子,这是段:
我对带标记的句子的理解是,如果Vector的get方法未同步或我没有劫持“帐户”的锁,则此传输方法将不是线程安全的。
然后我编写一些测试代码。然后我使用另一个锁而不劫持该锁,但是结果与我的理解相反。
以下是我的代码。
public class VectorBank {
public void transfer(Vector<Integer> accounts, int from, int to, Integer amount) {
synchronized (this) {
if (accounts.get(from) < amount) return;
accounts.set(from, accounts.get(from) - amount);
accounts.set(to, accounts.get(to) + amount);
System.out.println(getTotalBanlance(accounts));
}
}
public Integer getTotalBanlance(Vector<Integer> accounts) {
Integer sum = new Integer(0);
for (Integer a : accounts) {
sum += a;
}
return sum;
}
}
测试班:
public class VectorBankTest {
public static final int MAX_AMOUNT = 1000;
public static final int DELAY = 10;
public static final int NACCOUNTS = 100;
public static final int INITIAL_BALANCE = 1000;
public static void main(String[] args) {
Vector<Integer> accounts = new Vector<>();
for (int i = 0; i < NACCOUNTS; i++) {
accounts.add(INITIAL_BALANCE);
}
VectorBank bank = new VectorBank();
for (int i = 0; i < NACCOUNTS; i++) {
int fromAccount = i;
Runnable r = () -> {
try {
while (true) {
int toAccount = (int) (accounts.size() * Math.random());
int amount = (int) (MAX_AMOUNT * Math.random() + 1);
bank.transfer(accounts, fromAccount, toAccount, amount);
Thread.sleep((int) (DELAY * Math.random()));
}
} catch (InterruptedException e) {
System.out.println("Do nothing!");
}
};
Thread t = new Thread(r);
t.start();
}
}
}
结果使我感到困惑。我成功同步了所有线程,所有帐户的总支出始终为100000。
所以我的确切问题是,同步块确实可以做什么? “劫持锁”的真正含义是什么?
答案 0 :(得分:-1)
我们使用synced关键字来防止多个线程作用于属于同一对象的线程所作用的方法。同步主要用于防止线程结果不一致。同步会延迟其他线程的执行。因此,仅当我们希望特定的方法或代码块一次只应执行一个线程时,才使用syncly关键字。