码迷,mamicode.com
首页 > 编程语言 > 详细

线程同步的必要性

时间:2015-03-10 14:09:22      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

1、账户类

package com.ljb.app.synchronize;
/**
 * 模拟账户类(线程同步必要性)
 * @author LJB
 * @version 2015年3月10日
 */
public class Account {
 // 余额
 private int balance = 500;
 
 // 查询余额
 public int getBalance() {
  return balance;
 }
 // 取款(这里没有设置余额判断<余额大于0,余额足够支付取款数量>)
 public void withdraw (int amount) {
  balance = balance - amount;
 }
}

2、取款线程(拥有同一个账户)

 package com.ljb.app.synchronize;
/**
 * 取款线程(模拟动态取款)
 * @author LJB
 * @version 2015年3月10日
 */
public class WithdrawThread implements Runnable{
 /*
  *  所有用此对象创建的线程共享同一个账户
  */
 private Account account = new Account();
 
 /*
  *  取款、查询余额(non-Javadoc)
  * @see java.lang.Runnable#run()
  */
 public void run () {
  for (int i = 0 ; i < 5 ; i++) {
   // 取款
   makeWithdraw(100);
   
   // 查询余额
   if (account.getBalance() < 0) {
    System.out.println("账户透支了!");
   }
  } 
 }
 
 /*
  * 取款 (余额不足给出提示)
  */
 private void makeWithdraw (int amount) {
  if (account.getBalance() >= amount) {
   System.out.println(Thread.currentThread().getName() + "准备取款。");
   
   try {
    Thread.sleep(500);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   
   // 0.5秒之后完成取款
   account.withdraw(amount);
   System.out.println(Thread.currentThread().getName() + "完成取款。");
  } else {
   System.out.println("余额不足以支付" 
        + Thread.currentThread().getName()
        + "的取款,余额为" + account.getBalance());
  }
 }
}

3、测试类

 package com.ljb.app.synchronize;
/**
 * 创建2个线程同时使用同一个账户
 * @author LJB
 * @version 2015年3月10日
 */
public class TestWithdraw {
 /**
  * @param args
  */
 public static void main(String[] args) {
  // 创建实现Runnable接口类实例
  WithdrawThread withdraw = new WithdrawThread();
  
  // 创建2个线程
  Thread husband = new Thread(withdraw);
  Thread wife = new Thread(withdraw);
  
  husband.setName("丈夫");
  wife.setName("妻子");
  
  husband.start();
  wife.start();
 }
}

运行结果:

丈夫准备取款。
妻子准备取款。
妻子完成取款。
妻子准备取款。
丈夫完成取款。
丈夫准备取款。
妻子完成取款。
妻子准备取款。
丈夫完成取款。
丈夫准备取款。
妻子完成取款。
丈夫完成取款。
妻子准备取款。
丈夫准备取款。
丈夫完成取款。
账户透支了!
妻子完成取款。
账户透支了!
余额不足以支付妻子的取款,余额为-100
账户透支了!
余额不足以支付丈夫的取款,余额为-100
账户透支了!
4、同步方法

/*
  * 取款 (余额不足给出提示)
  */
 private synchronized void makeWithdraw (int amount) {
  if (account.getBalance() >= amount) {
   System.out.println(Thread.currentThread().getName() + "准备取款。");
   
   try {
    Thread.sleep(500);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   
   // 0.5秒之后完成取款
   account.withdraw(amount);
   System.out.println(Thread.currentThread().getName() + "完成取款。");
  } else {
   System.out.println("余额不足以支付" 
        + Thread.currentThread().getName()
        + "的取款,余额为" + account.getBalance());
  }
 }

运行结果:

丈夫准备取款。
丈夫完成取款。
妻子准备取款。
妻子完成取款。
妻子准备取款。
妻子完成取款。
妻子准备取款。
妻子完成取款。
丈夫准备取款。
丈夫完成取款。
余额不足以支付丈夫的取款,余额为0
余额不足以支付丈夫的取款,余额为0
余额不足以支付丈夫的取款,余额为0
余额不足以支付妻子的取款,余额为0
余额不足以支付妻子的取款,余额为0

 

线程同步的必要性

标签:

原文地址:http://my.oschina.net/u/2320342/blog/384666

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!