线程的互斥

来源:互联网 发布:飞秋软件下载 编辑:程序博客网 时间:2024/04/29 03:14

我们可以用关键字private来保证数据对象只能被本类方法访问,所以我们只需对方法提出一套机制,来对共享的数据对象进行互斥锁定,这套机制就是线程的互斥使用关键字synchronized,有synchronized方法和synchronized块两种方法。

举例:模拟对银行账户的存取款操作

package Winter;class Account3{//银行账户类 String name; float amount; public Account3(String name,float amount) { this.name=name; this.amount=amount; } public void deposit(float amt){this.amount+=amt;}//存款方法 public float withdraw(float amt)//取款方法 {if(this.amount<amt){amt=amount;amount=0;}return amt; } public float checkamount(){return this.amount;}//查询账户}class Save extends Thread{//存款线程private Account3 a;private float amount;public Save(Account3 a,float amt){this.a=a;this.amount=amt;}public void run(){synchronized(a){float k=a.checkamount();try{ this.sleep(10);}catch(InterruptedException e){System.out.println(e.getMessage());}a.deposit(this.amount);System.out.println("现有"+k+",存入"+this.amount+",余额"+a.checkamount());}}}class Fetch extends Thread{//取款线程private Account3 a;private int  amount;public Fetch(Account3 a,int amount){this.a=a;this.amount=amount;}public void run(){synchronized(a){float k=a.checkamount();try{ this.sleep(10);}catch(InterruptedException e){System.out.println(e.getMessage());}System.out.println("现有"+k+",取走"+a.withdraw(this.amount)+",余额"+a.checkamount());}}}public class test {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub       Account3 a1=new Account3("张三",100);       (new Save(a1,100)).start();       (new Save(a1,200)).start();       (new Fetch(a1,500)).start();}}


原创粉丝点击