【发布时间】:2017-03-03 10:15:39
【问题描述】:
我正在看一本书,看到一段代码说下面的代码是线程同步的:
//账户类
public class Account {
private double balance;
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public synchronized void addAmount(double amount) {
double tmp=balance;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
tmp+=amount;
balance=tmp;
}
public synchronized void subtractAmount(double amount) {
double tmp=balance;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
tmp-=amount;
balance=tmp;
}
}
//银行类
public class Bank implements Runnable {
private Account account;
public Bank(Account account) {
this.account=account;
}
@Override
public void run() {
for (int i=0; i<1000; i++){
account.subtractAmount(1000);
}
}
}
//公司类
public class Company implements Runnable {
private Account account;
public Company(Account account) {
this.account=account;
}
@Override
public void run() {
for (int i=0; i<1000; i++){
account.addAmount(1000);
}
}
}
//主类
public class Main {
public static void main(String[] args) {
Account account=new Account();
account.setBalance(1000);
Company company=new Company(account);
Thread companyThread=new Thread(company);
Bank bank=new Bank(account);
Thread bankThread=new Thread(bank);
System.out.printf("Account : Initial Balance: %f\n",account.
getBalance());
companyThread.start();
bankThread.start();
try {
companyThread.join();
bankThread.join();
System.out.printf("Account : Final Balance: %f\n",account.
getBalance());
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这里两个不同对象的两个线程使用 addAmount 和 subAmount 函数同时更改 balance 变量,但它总是给出正确的输出作为 Initial 和 Final balance 相同,即 1000.000 。我的意思是他们应该给我一些问题,因为两个线程同时在同一个变量上工作。
请纠正我哪里出错了。 提前致谢
【问题讨论】:
-
这就是你使用
synchronized的原因 -
其实这本书并不完全正确。您可以设置不同步的余额。只有加减法是。你能告诉我们这是什么书吗?
标签: java multithreading synchronization thread-safety