银行取钱问题:
银行卡类:
public class Card {
private int money;
private boolean choose;
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
//存钱方法
public synchronized void save(){
while (choose){//choose初始值为true
try {
this.wait();//此时如果存钱线程抢到内存,则释放内存和锁,进入等待状态。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
money+=1000;
System.out.println(Thread.currentThread().getName()+"存了1000元,当前余额"+this.money);
choose=true;//更改标记为true,使之可以进入取钱方法
this.notifyAll();//唤醒所有等待的线程,如果写notify,因为是随机唤醒,所以在执行n次后,会因为存钱或者取钱线程全部等待而进入死锁
}
//取钱方法
public synchronized void sub(){
while (!choose){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
money-=1000;
System.out.println(Thread.currentThread().getName()+"取了1000元,当前余额"+this.money);
choose=false;
this.notifyAll();
}
}
存钱类:
public class Add implements Runnable {//实现runnable接口继承run方法
Card card; //实例化card对象
public Add(Card card) {
this.card = card;
}
@Override
public void run() {
for (int i=0;i<10;i++) {//存取十次
card.save();
}
}
}
取钱类:
public class Sub implements Runnable{
Card card;
public Sub(Card card) {
this.card = card;
}
@Override
public void run() {
for (int i=0;i<10;i++) {
card.sub();
}
}
}
测试类:
public class Test {
public static void main(String[] args) throws Exception{
Card card =new Card();
Add add =new Add(card);
Sub sub = new Sub(card);//传入同一个card对象,存取在一个数据中
Thread t1=new Thread(add, "zhangsan");
Thread t2 = new Thread(sub, "lisi");
t1.start();
t2.start();
}
}
生产者消费者设计模式保证了一产一消的结构,两个线程一一对应,不会出现多个线程同时取导致的数据错误问题,但是设置过多会影响网络传输速度,一般用在传输比较重要的信息上。