多线程的同步问题
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 }