(转自:https://blog.csdn.net/antony9118/article/details/51482397 侵删)
之前在这个系列的第一篇博客 JAVA多线程(一)基本概念和上下文切换性能损耗中,提到过多线程之间共享数据很方便。那么,究竟怎么做呢?
1 火车票模型
模型说明:购买火车票有多种方式,每种方式在同一时刻看到的剩余票数必须是相同的,而且每个线程执行的核心代码都是给票数减一。
public class Ticket implements Runnable{
private int ticket = 10;
public static Object obj=new Object();
public void run() {
synchronized(obj){
while(ticket>0){
ticket--;
System.out.println("当前剩余票数为:"+ticket);
}
}
}
}
public class TicketSeller {
public static void main(String[] args) {
Ticket t = new Ticket();
new Thread(t).start();
new Thread(t).start();
}
}
- 2 银行问题
与火车票模型只做减法不同,银行模型要求既可以取钱,也可以存钱(也就是要实现deposit和withdraw方法),而且每次不是加一或者减一那么简单,存入或者取出的数额应该由用户在代码中输入。同时,也可以加入转账功能,从一个账户扣钱加到另一个账户。
class BankAccount {
private decimal balance = 0.0M;
public static Object obj=new Object();
internal void Deposit(decimal amount) {
lock (obj) { balance += amount; }
}
internal void Withdraw(decimal amount) {
lock (obj) {
if (balance < amount)
throw new Exception("余额不足");
balance -= amount;
}
}
internal void Transfer(BankAccount a, BankAccount b, decimal amount) {
lock (a.obj) {
lock (b.obj) {
Withdraw(a.amount);
Deposit(b.amount);
}
}
}
}