为什么会出现这样的问题?这就是多线程中的同步的问题在我们的程序中Account中的amount会同时被多个线程所访问这就是一个竞争资源通常称作竞态条件对于这样的多个线程共享的资源我们必须进行同步以避免一个线程的改动被另一个线程所覆盖在我们这个程序中Account中的amount是一个竞态条件所以所有对amount的修改访问都要进行同步我们将deposit()和withdraw()方法进行同步修改为
public synchronized void deposit(float amt)
{
float tmp = amount;
tmp += amt;
try
{
Threadsleep();
//模拟其它处理所需要的时间比如刷新数据库等
}
catch (InterruptedException e)
{
// ignore
}
amount = tmp;
}
public synchronized void withdraw(float amt)
{
float tmp = amount;
tmp = amt;
try
{
Threadsleep();
//模拟其它处理所需要的时间比如刷新数据库等
}
catch (InterruptedException e)
{ // ignore }
amount = tmp;
}
此时
再运行
我们就能够得到正确的结果了
Account中的getBalance()也访问了amount
为什么不对getBalance()同步呢?因为getBalance()并不会修改amount的值
所以
同时多个线程对它访问不会造成数据的混乱
[] [] []