使用Lock锁可以代替synchronized,那么它的线程通讯该怎么用呢?
使用Condition搭配Lock锁实现线程通讯,在Condition对象中,与wait、notify、notifyAll对应的方法是await、signal、signalAll。
先看一下之前生产者与消费者的例子:
public class LockProducerAndConsumer {
public static void main(String[] args) {
Goods goods = new Goods();
Thread thread1 = new Thread(new Producer(goods));
Thread thread2 = new Thread(new Consumer(goods));
thread1.start();
thread2.start();
}
}
class Goods{
public int count = 100;
/**
* 生产
* @throws InterruptedException
*/
public void doProducer() throws InterruptedException{
synchronized (this) {
this.notify();
this.wait();
count++;
System.out.println("生产了一件商品,当前库存:"+count);
}
}
/**
* 销售
* @throws InterruptedException
*/
public void doSell() throws InterruptedException{
synchronized (this) {
this.notify();
this.wait();
count--;
System.out.println("消费了一件商品,当前库存:"+count);
}
}
}
class Producer implements Runnable{
private Goods goods;
public Producer(Goods goods) {
super();
this.goods = goods;
}
public void run() {
while(true){
try {
goods.doProducer();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
private Goods goods;
public Consumer(Goods goods) {
super();
this.goods = goods;
}
public void run() {
while(true){
try {
goods.doSell();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
使用lock锁与Condition搭配:
public class LockProducerAndConsumer {
public static void main(String[] args) {
Goods goods = new Goods();
Thread thread1 = new Thread(new Producer(goods));
Thread thread2 = new Thread(new Consumer(goods));
thread1.start();
thread2.start();
}
}
class Goods{
public int count = 100;
Lock lock = new ReentrantLock();
Condition newCondition = lock.newCondition();
/**
* 生产
* @throws InterruptedException
*/
public void doProducer() throws InterruptedException{
lock.lock();
newCondition.signal();
newCondition.await();
count++;
System.out.println("生产了一件商品,当前库存:"+count);
lock.unlock();
}
/**
* 销售
* @throws InterruptedException
*/
public void doSell() throws InterruptedException{
lock.lock();
newCondition.signal();
newCondition.await();
count--;
System.out.println("消费了一件商品,当前库存:"+count);
lock.unlock();
}
}
class Producer implements Runnable{
private Goods goods;
public Producer(Goods goods) {
super();
this.goods = goods;
}
public void run() {
while(true){
try {
goods.doProducer();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
private Goods goods;
public Consumer(Goods goods) {
super();
this.goods = goods;
}
public void run() {
while(true){
try {
goods.doSell();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}