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