为了避免死锁,我们引用生产者消费者模式,就像我要筷子的时候,你就把筷子给我,我吃一口,然后你要碗的时候,我就把碗给你,你再吃一口。
共享吃饭程序:
我吃的时候你把筷子给我,你吃的时候我把碗给你
public class CHIFAN {
// 信号灯,为true 的时候我吃,你看,为false 的时候我看你吃
private boolean flag = true;
/**
* 我吃你看,我是消费者
*/
public synchronized void eat() {
if(!this.flag) { // 生产者等待,筷子给你
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 得到筷子了,开始吃饭
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println( "好了,我吃了一口,筷子给你" );
// 通知消费者
this.notify();
// 生产者停下
this.flag = false;
}
/**
* 你吃我看,我把碗给你,你来生产
*/
public synchronized void youeat() {
if(this.flag) { // 消费者等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 得到碗了,开始吃饭
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println( "好了,我也吃了一口,碗也给你" );
// 通知生产
this.notify();
// 通知生产者
this.flag = true;
}
}
你把碗给我,我先吃一口
public class YOU implements Runnable {
private CHIFAN chifan;
public YOU(CHIFAN chifan) {
super();
this.chifan = chifan;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
// 偶数我吃,奇数你吃
this.chifan.eat();
}
}
}
你把筷子给我,我在吃一口:
public class ME implements Runnable {
private CHIFAN wan;
public ME(CHIFAN wan) {
super();
this.wan = wan;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
// 偶数我吃,奇数你吃
if( 0 == i%20 ) {
this.wan.eat();
}else {
this.wan.youeat();
}
}
}
}
调用:
public static void main(String[] args) {
// 吃饭,共同的资源
CHIFAN c = new CHIFAN();
// 多线程
ME m = new ME(c);
YOU y = new YOU(c);
new Thread(m).start();
new Thread(y).start();
}
运行效果: