【发布时间】:2019-06-18 01:55:46
【问题描述】:
在Java 中,标记方法synchronized 应该禁用 竞争条件,这会由两个线程调用访问和修改同一对象中的字段的方法引起。
但由于某种原因,synchronized 在以下示例中无法按预期工作,除非我在主程序的两个线程上调用 .join()。这是为什么呢?
package example;
public class Account {
private double balance;
public Account(double balance) {
super();
this.balance = balance;
}
public synchronized void deposit(double amount) {
balance += amount;
}
public double getBalance() {
return balance;
}
}
package example;
public class AccountTester extends Thread {
private Account account;
private double amount;
public AccountTester(Account account, double amount) {
this.account = account;
this.amount = amount;
}
public static void main(String[] args) {
Account account = new Account(0);
AccountTester tester1 = new AccountTester(account, 1.0);
AccountTester tester2 = new AccountTester(account, 2.0);
tester1.start();
tester2.start();
// Why do I need the main thread to join threads
// tester1 and tester2 for synchronized to work?
try {
tester1.join();
tester2.join();
} catch (InterruptedException e) {
System.err.println(e);
}
System.out.println("End balance: " + account.getBalance());
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
account.deposit(amount);
}
}
}
【问题讨论】:
-
与
synchronized方法无关。如果你不join程序将退出而不等待线程实际做任何工作。启动线程不是即时的,请尝试使用sleep(1000)而不是join并查看差异。 -
谢谢@flakes。这对我的理解很有帮助。
标签: java concurrency synchronized