首页 > 代码库 > 多线程的互斥同步(存款取款基础版)

多线程的互斥同步(存款取款基础版)

1、互斥:多个线程同时访问一个资源的时候,由于线程执行的不稳定,使得资源数据遭到破坏:

  经典的例子:银行的存款和取款(两个线程访问一个1000元账户,A线程取200,B线程寸300,由于线程执行的不稳定,在A执行到取出1000-200的操作时,

  (此时还未将执行结果保存到账户)CPU执行权到B线程,B取到的还是1000 +300 = 1300....)。为了防止这种情况,应该将互斥的资源加上同步锁

 1 package com.thread; 2 /** 3  * 模拟同步取款的问题 4  * @author dr 5  * 6  */ 7 public class ThreadTest { 8     public static void main(String[] args) { 9         final Account account = new Account();10         //取出20011         new Thread(new Runnable() {12             @Override13             public void run() {14                 for(int i=0;i<3;i++){15                     try {16                         Thread.sleep(500);17                     } catch (InterruptedException e) {18                         // TODO Auto-generated catch block19                         e.printStackTrace();20                     }21                     account.getMoney(200);22                 }23             }24         }).start();25         //存入30026         new Thread(new Runnable() {27             @Override28             public void run() {29                 for(int i=0;i<3;i++){30                     try {31                         Thread.sleep(500);32                     } catch (InterruptedException e) {33                         // TODO Auto-generated catch block34                         e.printStackTrace();35                     }36                     account.setMoney(300);37                 }38             }39         }).start();40     }41 }42 class Account {43     44     private int balance = 1000;45 46     public synchronized void getMoney(int count){47         48         int result =balance - count;49         if(result >= 0){50             balance = result;51             System.out.println(Thread.currentThread().getName()+"取出:"+count+"元,剩余:"+balance);52         }else{53             System.out.println("余额不足...");54         }55     }56     public synchronized void setMoney(int count){57             58             balance += count;59             System.out.println(Thread.currentThread().getName()+"存入:"+count+"元,剩余:"+balance);60     }61     62 }

 通常将互斥的资源定义为一个类中加上同步所。在多线程使用的时候就会很方便....

多线程的互斥同步(存款取款基础版)