首页 > 代码库 > 多线程的互斥同步(存款取款基础版)
多线程的互斥同步(存款取款基础版)
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 }
通常将互斥的资源定义为一个类中加上同步所。在多线程使用的时候就会很方便....
多线程的互斥同步(存款取款基础版)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。