/* 生产者消费者:
- 研究:研究Lock
- 比较synchronized和Lock
- 1.synchronized:从jdk1.0就开始使用的同步方法-称为隐式同步
- synchronized(锁对象){//获取锁 我们将锁还可以称为锁旗舰或者监听器
- ////////////// 这里放同步的代码
- }//释放锁
- 2.Lock:从jdk1.5开始使用的同步方法-称为显示同步
- 原理:Lock本身是接口,要通过他的子类创建对象干活儿
- 使用过程:
- 首先调用lock()方法获取锁
- 进行同步的代码块儿
- 使用unlock()方法释放锁
- 使用的场景:
- 当进行多生产者多消费者的功能时,使用Lock,其他的都使用synchronized
- 使用效率上:Lock高于synchronized
*/
主方法:
public class Demo {
public static void main(String[] args) {
//准备数据
Product2 product = new Product2();
//准备任务
Producer2 producer = new Producer2(product);
Consumer2 consumer = new Consumer2(product);
//准备线程
Thread proThread1 = new Thread(producer);
Thread proThread2 = new Thread(producer);
Thread conThread1 = new Thread(consumer);
Thread conThread2 = new Thread(consumer);
//开启线程
proThread1.start();
conThread1.start();
proThread2.start();
conThread2.start();
}
}
创建产品:
//创建产品
class Product2{
String name;//产品的名字
double price;//产品的价格
int count;//生产的产品数量
//标识
boolean flag = false;
//创建锁对象
Lock lock = new ReentrantLock();
//用于生产任务的Condition
Condition proCon = lock.newCondition();
//用于消费任务的Condition
Condition conCon = lock.newCondition();
//准备生产
public void setProduce(String name,double price){
try {
lock.lock();//获取锁
while (flag == true) {
try {
//wait();//让生产线程等待
proCon.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.name = name;
this.price = price;
System.out.println(Thread.currentThread().getName()+" 生产了:"+this.name+" 产品的数量:"+this.count+" 价格:"+this.price);
count++;
flag = ! flag;
//notify();//唤醒消费线程
//notifyAll();
conCon.signal();
}finally {
lock.unlock();//释放锁
}
}
//准备消费
public void getConsume() {
try {
lock.lock();
while (flag == false) {
try {
//wait();//让消费线程等待
conCon.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
count--;
System.out.println(Thread.currentThread().getName()+" 消费了:"+this.name+" 产品的数量:"+this.count+" 价格:"+this.price);
//唤醒生产线程
flag = ! flag;
//notify();
//notifyAll();
proCon.signal();
}finally {
lock.unlock();
}
}
}
创建生产任务和消费任务:
//创建生产任务
class Producer2 implements Runnable{
Product2 product;
public Producer2(Product2 product) {
super();
this.product = product;
}
public void run() {
while (true) {
product.setProduce("bingbing", 10);
}
}
}
//创建消费任务
class Consumer2 implements Runnable{
Product2 product;
public Consumer2(Product2 product) {
super();
this.product = product;
}
public void run() {
while (true) {
product.getConsume();
}
}
}