线程互斥是解决线程间竞争关系的手段。
在上一篇中,由于两个线程对同一个账户资源进行操作,两线程在同时对“张三”这个账户时进行操作时,存在着竞争关系,就造成了输出结果的不正确。
要解决这个问题,就要使账户在同一时间里只能被一个线程占用,只有当这个线程执行完了,才释放此资源供其它线程调用。
线程互斥指的就是若干个线程要使用同一共享资源时,任何时刻最多允许一个线程去使用,其他要使用该资源的线程必须等待,直到占有资源的线程释放该资源。
1、互斥实现
Java提供关键字synchronized用于声明一段程序为临界区,使线程对临界资源采用互斥使用方法。
其语法如下:
synchronized(对象)
语句
2、例
同上篇中例。
改写时Account和exa两个类不变,只需要在取钱类和存钱类中分别添加声明为临界资源的语句即可。详见注释
public class SaveMoney extends Thread{
private Account account;
private doublevalue;
public SaveMoney(Account a,double v) {
this.account=a;
this.value=v;
}
public void run() {
synchronized(this.account){//声明 account为临界资源,只能被互斥使用
this.account.cunqian(value);
System.out.println("存入"+value+"后,您的账户余额为:"+this.account.money);
}
}
}
public class getMoney extends Thread{
private Account account;
private doublevalue;
public getMoney(Account a,double v) {
this.account=a;
this.value=v;
}
public void run() {
synchronized(this.account){//声明 account为临界资源,只能被互斥使用
this.account.quqian(value);
System.out.println("取出"+value+"后,您的账户余额为:"+this.account.money);
}
}
}
此时再运行exa中的main方法,其运行结果如下:
此时的结果就是正常的运行结果了。
联系客服