使用取钱的demo来模拟实现线程的同步

  1 package com.iotec.synchronizedTest;
  2 
  3 import java.io.ObjectInputStream;
  4 
  5 public class BankDemo {
  6     public static void main(String[] args) {
  7         Bank bank = new Bank();
  8         BankThread p1 = new BankThread(bank);
  9         p1.start();     //柜台取钱
 10         BankThread p2 = new BankThread(bank);
 11         p2.start();     //ATM机上取钱
 12 
 13     }
 14 }
 15 
 16 class BankThread extends Thread{
 17     private Bank bank = null;
 18     public BankThread(Bank bank){
 19         this.bank = bank;
 20     }
 21 
 22     @Override
 23     public void run() {
 24         System.out.println(Thread.currentThread().getName()+"取钱:"+bank.getMoney(400));
 25     }
 26 }
 27 
 28 class Bank {
 29     //把竞争访问的资源标识为private
 30     private int money = 500;
 31 
 32     private Object object = new Object();
 33     //取钱的方法,返回取钱的数目
 34     //当一个线程去调用同步方法的时候,这个线程就获得当前对象的锁
 35     //其它线程当调用同步方法的时候只能等待,因为无法获取对象的锁
 36     //只有第一个线程释放对象的锁方可进入
 37 /*    public synchronized int getMoney(int number){
 38         if(number<0){
 39             return -1;
 40         }else if(money<0){
 41             return -2;
 42         }else if(number-money>0){
 43             return -3;
 44         }else {
 45             try {
 46                 Thread.sleep(1000); //模拟取钱的时间
 47             } catch (InterruptedException e) {
 48                 e.printStackTrace();
 49             }
 50             money -= number;
 51             System.out.println("余额:"+money);
 52         }
 53         return number;
 54     }*/
 55     public synchronized int getMoney(int number){
 56 //        synchronized (this){
 57         //可以持有的是任何对象
 58         synchronized (object){
 59             if(number<0){
 60                 return -1;
 61             }else if(money<0){
 62                 return -2;
 63             }else if(number-money>0){
 64                 return -3;
 65             }else {
 66                 try {
 67                     Thread.sleep(1000); //模拟取钱的时间
 68                 } catch (InterruptedException e) {
 69                     e.printStackTrace();
 70                 }
 71                 money -= number;
 72                 System.out.println("余额:"+money);
 73             }
 74             return number;
 75         }
 76 
 77     }
 78    /* public synchronized int getMoney(int number){
 79 
 80             if(number<0){
 81                 return -1;
 82             }else if(money<0){
 83                 return -2;
 84             }else if(number-money>0){
 85                 return -3;
 86             }else {
 87                 //放在这里是不对的,因为等第一个线程执行完,第二个线程对上面的逻辑并不会进行判断
 88                 //所以需要考虑清楚需要同步的是哪一个代码块
 89                 synchronized (this){
 90                     try {
 91                         Thread.sleep(1000); //模拟取钱的时间
 92                     } catch (InterruptedException e) {
 93                         e.printStackTrace();
 94                     }
 95                     money -= number;
 96                     System.out.println("余额:"+money);
 97                 }
 98             }
 99         return number;
100     }*/
101 
102 }
View Code

相关文章: