上一篇的讲解虚假唤醒的代码,现在我们synchronized 改为同步锁 Lock
package com.gf.demo;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TestProductorAndConsumer {
public static void main(String args[]) {
Clerk clerk = new Clerk();
Productor pro = new Productor( clerk );
Consumer cus = new Consumer( clerk );
new Thread( pro, "生产者A" ).start();
new Thread( cus, "消费者" ).start();
new Thread( pro, "生产者C" ).start();
new Thread( cus, "消费者D" ).start();
}
}
/**
* 店员
*/
class Clerk {
private int product = 0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
/**
* 进货
*/
public void get() {
try {
lock.lock();
while (1 <= product) {
System.out.println( "产品已满" );
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println( Thread.currentThread().getName() + " : " + ++product );
condition.signalAll();
} finally {
lock.unlock();
}
}
/**
* 卖货
*/
public void sale() {
try {
lock.lock();
while (0 >= product) {
System.out.println( "缺货 !" );
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println( Thread.currentThread().getName() + " : " + --product );
condition.signalAll();
} finally {
lock.unlock();
}
}
}
/**
* 生产者
*/
class Productor implements Runnable {
private Clerk clerk;
public Productor(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
try {
//模拟网络延迟
Thread.sleep( 200 );
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.get();
}
}
}
/**
* 消费者
*/
class Consumer implements Runnable {
private Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
clerk.sale();
}
}
}
评论