线程互斥是解决线程间竞争关系的手段。 在上一篇中,由于两个线程对同一个账户资源进行操作,两线程在同时对“张三”这个账户时进行操作时,存在着竞争关系,就造成了输出结果的不正确。 要解决这个问题,就要使账户在同一时间里只能被一个线程占用,只有当这个线程执行完了,才释放此资源供其它线程调用。 线程互斥指的就是若干个线程要使用同一共享资源时,任何时刻最多允许一个线程去使用,其他要使用该资源的线程必须等待,直到占有资源的线程释放该资源。 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方法,其运行结果如下: 此时的结果就是正常的运行结果了。 |
|
来自: pythonjava学习 > 《待分类》