标签:
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