多线程

多线程的同步问题

 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     }

 

转载于:https://www.cnblogs.com/javatrain/p/6559110.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值