java 锁存在两种机制Synchronized和Lock两种实现。
Synchronized 实现生产消费模式,之前写个一个文章,这里我用Lock来实现。
我用Lock 的Condition,来实现Synchronized 的wait和notify功能。
Condition producerCon = lock.newCondition();
Condition consumerCon = lock.newCondition();
两种Condition互相唤醒彼此线程。
主类如下:
public class Main {
public static void main(String[] args) throws InterruptedException {
Main main = new Main();
new Producer(main).start();
new Consumer(main).start();
}
static List<Integer> list = new ArrayList<Integer>();
int size = 100;
Lock lock = new ReentrantLock();
Condition producerCon = lock.newCondition();
Condition consumerCon = lock.newCondition();
void producer() throws InterruptedException {
lock.lock();
try {
if (list.size() + 1 > size) {
System.out.println("Producer waiting......");
System.out.println(Thread.currentThread().getName() + " Producer inall:" + list.size());
consumerCon.signal();
producerCon.await();
}
list.add((int) (Math.random() * 100));
} finally {
lock.unlock();
}
}
void consumer() throws InterruptedException {
lock.lock();
try {
if (list.size() <= 0) {
System.out.println("consumer waiting......");
System.out.println(Thread.currentThread().getName() + " consumer inall:" + list.size());
producerCon.signal();
consumerCon.await();
}
if (list.size() > 0) {
list.remove(0);
} else {
list.clear();
}
} finally {
lock.unlock();
}
}
}
分别创建生产类和消费类:
class Producer extends Thread {
private Main main;
public Producer(Main main) {
super();
this.main = main;
}
@Override
public void run() {
try {
while (true)
main.producer();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer extends Thread {
private Main main;
public Consumer(Main main) {
super();
this.main = main;
}
@Override
public void run() {
try {
while (true)
main.consumer();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
执行后,得到结果:
Producer waiting......
Thread-0 Producer inall:100
consumer waiting......
Thread-1 consumer inall:0
Producer waiting......
Thread-0 Producer inall:100
consumer waiting......
Thread-1 consumer inall:0
Producer waiting......
Thread-0 Producer inall:100
consumer waiting......
Thread-1 consumer inall:0
Producer waiting......
Thread-0 Producer inall:100
consumer waiting......
Thread-1 consumer inall:0
Producer waiting......
每次生产超过100后,就进入等待。然后消费。这样就实现了边生产边消费。