黑色星球
风遇浪,海市蜃楼

多线程的同步问题

 1 package THRead0316;
 2 
 3 public class Acount {
 4     private String name;//账户名字
 5     private double balance=1000.0;//账户余额
 6     public String getName() {
 7         return name;
 8     }
 9     public void setName(String name) {
10         this.name = name;
11     }
12     public double getBalance() {
13         return balance;
14     }
15 
16     public void setBalance(double balance) {
17         this.balance = balance;
18     }
19 //取钱过程    同步锁1、synchronized
20     public synchronized void quqian(String name, double money) {
21         if (balance >= money) {
22             System.out.println(name + "取了" + money + "块钱");
23             setBalance(getBalance() - money);//取钱后余额
24             System.out.println("余额" + getBalance());
25         } else {
26             System.out.println(name + "是个穷鬼");
27         }
28 
29     }
30 
31 }

Thread的run

 1 package THRead0316;
 2 
 3 public class DrawCash extends Thread{//容易犯的小错误,不继承这个Thread
 4 private String name;
 5 private Acount acount;
 6 private double money ;
 7 
 8 public DrawCash(String name,Acount acount,double money){
 9     this.name=name;
10         this.acount = acount;
11         this.money =money;
12     
13     }
14 public void run(){
15     acount.quqian(name,money);
16 }
17 }

运行

 1 package THRead0316;
 2 
 3 public class Test {
 4     public static void main(String args[]){
 5         Acount a=new Acount();
 6         new DrawCash("斗笔",a,800).start();
 7         new DrawCash("饿货",a,800).start();
 8         new DrawCash("饿货1",a,800).start();
 9         new DrawCash("饿货2",a,800).start();
10         new DrawCash("饿货3",a,800).start();
11         //不用synchronized就会出现-600的情况
12         //问题是为什么DrawCash不this.acount就会两条单线一起来,打出来的都是取了800.余额200
13         
14     }
15 
16 }

同步的第二种方法

 1 package THRead0316;
 2 
 3 import java.util.concurrent.locks.ReentrantLock;
 4 
 5 public class Acount1 {
 6     private final ReentrantLock lock = new ReentrantLock();
 7         private String name;//账户名字
 8         private double balance=1000.0;
 9         public String getName() {
10             return name;
11         }
12         public void setName(String name) {
13             this.name = name;
14         }
15         public double getBalance() {
16             return balance;
17         }
18         public void setBalance(double balance) {
19             this.balance = balance;
20         }
21         
22         
23     public void quqian(String name, double money) {
24         lock.lock();
25         try {
26             if (balance >= money) {
27                 System.out.println(name + "取了" + money + "块钱");
28                 setBalance(getBalance() - money);
29                 System.out.println("余额" + getBalance());
30             } else {
31                 System.out.println(name + "是个穷鬼");
32             }
33         } catch (Exception e) {
34             e.printStackTrace();
35         } finally {
36             lock.unlock();
37         }
38 
39     }
40 
41     }

 

posted on 2017-03-16 13:46  黑色星球  阅读(166)  评论(0编辑  收藏  举报