线程在执行的过程中,有可能会需要共享资源或者交换数据,则称这一组线程为交互线程。 线程间的交互存在两种关系:竞争和协作。 竞争关系是指,两个线程同时使用同一个资源时,会产生竞争。此时,由于线程的并发执行,可能会产生与时间有关的错误。 如以下例题: 本例题是模拟银行的账户,存款和取款均为线程,对不同账户的操作不会产生问题,但如果是对同一个账户同时存款和取款时,可能会发生错误,其代码如下: public class Account {//账户类 String name; double money; public Account() { name=null; money=0; } public Account(String name,double money) { this.set(name,money); } public void set(String name,double money) { this.name=name; this.money=money; } public String get_name() { return name; } public double get_money() { return money; } public void quqian(double money) {//取钱 if(money<0) ; if(this.money>money) this.money=this.money-money; else System.out.println("您的账户余额不足"); } public void cunqian(double money) {//存钱 if(money>0) this.money+=money; } public String toString() { return"账户名:"+this.name+",账户中有:"+this.money; } } class exa{ public static void main(String args[]) { Account count=new Account("张三",300); System.out.println(count); SaveMoney save=new SaveMoney(count,100); SaveMoney save1=new SaveMoney(count,100); save.start(); save1.start(); getMoney get=new getMoney(count,100); get.start(); } } 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() { 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() { this.account.quqian(value); System.out.println("取出"+value+"后,您的账户余额为:"+this.account.money); } } 其运行结果如下: 从这个结果会发现,“张三”这个账户中原有300元,在存入100元之后却变成了500元,这个结果明显不是我们想要的结果,产生这个错误的原因就在于,存钱线程有两个,取钱线程有一个,都是对账户“张三”在进行操作,由于线程的并发执行,在两个存钱线程有可能是同时执行的,所以它的结果会变为500,但这个结果是错误的。 要解决这个错误,需要互斥。 下一篇会介绍线程的互斥。 |
|
来自: pythonjava学习 > 《待分类》