Java多线程学习之路(三)—解决共享资源问题线程同步(更新中)
多线程不仅会带来各种好处,但是也对程序员提出了更高的要求,其中最重要的就是如何解决多个线程与共享资源的关系.多个线程经常会彼此干涉从而造成麻烦.比如 一个多线程的银行系统,一个用户的账户余额现在是500元.现在用户在商场购物,刷卡付费300元(一个线程),于此同时他的儿子偷偷的用他的账户给网游充值400(另一个线程).两个线程同时访问该数据,而且当时访问的数据都是账户余额500元,如果没有同步机制.那么这两个操作都会成功.显然这会给银行系统造成巨大损失.
3.1 多线程问题模拟
下面是代码模拟上文场景.多线程如果不进行同步可能会造成的巨大问题.
背景:一个银行账号有1000的余额,然后多个用户同时去消费100元.
信用卡账户类
public class CreditCard implements Runnable
{
private Double balance=1000D;
private Double spendMoney;
public CreditCard(Double spendMoney)
{
this.spendMoney = spendMoney;
}
public void run()
{
try
{
Thread.sleep(1000);//通过sleep方法增加多个线程同时访问变量的可能性
} catch (InterruptedException e)
{
e.printStackTrace();
}
if (balance>spendMoney)
{
balance-=spendMoney;
System.out.println(Thread.currentThread().getName()+" : "+balance);
}
}
}
主函数所在类:多个线程
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public