package thread_communication;
import java.util.concurrent.locks.*;
/*
*
* notify之后和正常线程一样有资格竞争执行权;
*
* 新特性:1.5之后
* 隐式的synchronized--->显式的lock.lock();lock.unlock();
* wait,notify--->显式的等待唤醒condition.await();condition.singal();
*
* 一个锁lock可以有好几个不同的await singal分别进行等待唤醒,替代了嵌套同步可能造成的死锁问题;
*
* 实现了本方只唤醒对方的操作
*
* 释放锁的操作一定要执行;
*
* */
class Resource{
private String name;
private int num=1;
private boolean mark=false;
private Lock lock=new ReentrantLock();//lock接口
private Condition condition_1=lock.newCondition();//利用不同的锁条件进行等待和启用;
private Condition condition_2=lock.newCondition();//条件2
public void pro(String name)throws InterruptedException
{
lock.lock();
try{
while(mark)//保证不会生产两次消费一次
condition_1.await();
this.name=name+" ,"+num++;
System.out.println(Thread.currentThread().getName()+" produce comodity: "+this.name);
mark=true;
condition_2.signalAll();
}
finally{
lock.unlock();//抛出异常也必须要把锁给释放掉;释放锁的操作一定要执行;
}
}
public void print()throws InterruptedException{
lock.lock();
try{
while(!mark)//保证不会消费两次生产一次
condition_2.await();
System.out.println(Thread.currentThread().getName()+"consume comodity: "+name);
mark=false;
condition_1.signalAll();
}
finally{
lock.unlock();//抛出异常也必须要把锁给释放掉;释放锁的操作一定要执行;
}
}
}
class producer implements Runnable{
Resource r;
producer(Resource r){
this.r=r;
}
public void run(){
while(true){
try{
r.pro("bag");
}
catch(Exception e){}
}
}
}
class consumer implements Runnable{
Resource r;
consumer(Resource r){
this.r=r;
}
public void run(){
while(true){
try{
r.print();
}
catch(Exception e){}
}
}
}
public class Producer_Customer {
public static void main(String[] args) {
Resource rr=new Resource();
consumer c=new consumer(rr);
producer p=new producer(rr);
Thread t1=new Thread(c);
Thread t2=new Thread(c);
Thread t3=new Thread(p);
Thread t4=new Thread(p);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
进程锁改进版
最新推荐文章于 2022-03-04 14:13:12 发布