多态锁

  有多个生产者和多消费者的时候

          问题1: 会同时生产多个或者同时消费多个,达不到生产一只就消费一只的目的
          原因 : 当前任务下的线程再次唤醒后没有继续判断标记
          办法 : 在线程进入判断标记 碰到wait后,再次唤醒还要继续判断标记  
          将if改成while  

  问题2 : 将if改成while后 ,线程死锁了..

          原因 : 线程每次唤醒了同一任务下的线程,就产生死锁
          办法 : 将线程池中等待的线程全部唤醒
          notify --> notifyAll(); 

 更好的来优化 多生产者和多消费者的问题(JAVA当中的多态锁)
          * Java 提供了一个多态锁 ReentrantLock(可重入的互斥锁)

支持Condition对象 监视器当前的环境对象

          Condition提供了三个方法
          await()           ----->   wait
          signal()          ----->   notify()
          signalAll()       ----->   notifyAll() 


          try 
          尝试着执行一段代码,在使用资源(做数据库的操作,对流的操作...)
          catch 
          抓去异常,解决问题
          finally
          必须执行的 释放资源(关闭数据库连接,关闭ResultSet.关闭流对象..) 

多消费者多生产者多态锁运用
class KFC {

Lock lock = new ReentrantLock();
//创建俩个监视器
Condition chiefCon = lock.newCondition();
Condition customerCon = lock.newCondition();

private String foodName;
private int count;//数量
private boolean flag = false;

/**
 * 生产食物
 */
public void put(String foodName){//
    lock.lock();//锁上了
    try{
        while(flag)
            try {chiefCon.await();} catch (InterruptedException e) {}
        count++;
        this.foodName = "第" + count +"份"+ foodName;
        System.out.println(Thread.currentThread().getName() + "生产了" + this.foodName);

        flag = true;
        customerCon.signal();
    }finally{
        lock.unlock();//释放锁
    }
}

/**
 * 消费食物
 */
public  void take(){
    lock.lock();
    try{
        while(!flag)
            try {customerCon.await();} catch (InterruptedException e) {}

        System.out.println(Thread.currentThread().getName() + "...消费了" + foodName);

        flag = false;
        chiefCon.signal();
    }finally{
        lock.unlock();
    }
}

}

class Chief implements Runnable{
private KFC kfc;

public Chief(KFC kfc) {
    this.kfc = kfc;
}

@Override
public void run() {
    while(true){
        kfc.put("XX烤翅");
    }
}

}

class Customer implements Runnable{

private KFC kfc;

public Customer(KFC kfc) {
    this.kfc = kfc;
}

@Override
public void run() {
    while(true){
        kfc.take();
    }
}

}

/**
* 有多个生产者和多消费者的时候
*
* 问题1: 会同时生产多个或者同时消费多个,达不到生产一只就消费一只的目的
* 原因 : 当前任务下的线程再次唤醒后没有继续判断标记
* 办法 : 在线程进入判断标记 碰到wait后,再次唤醒还要继续判断标记
* 将if改成while
*
* 问题2 : 将if改成while后 ,线程死锁了..
* 原因 : 线程每次唤醒了同一任务下的线程,就产生死锁
* 办法 : 将线程池中等待的线程全部唤醒
* notify –> notifyAll();
*
* 更好的来优化 多生产者和多消费者的问题
*
* java中的多态锁..
*
* @author Administrator
*
*/

public class KFCTest2{

public static void main(String[] args) {
    KFC kfc = new KFC();

    Chief chief1 = new Chief(kfc);
    Chief chief2 = new Chief(kfc);

    Customer customer1 = new Customer(kfc);
    Customer customer2 = new Customer(kfc);

    Thread t1 = new Thread(chief1);
    Thread t2 = new Thread(chief2);

    Thread t3 = new Thread(customer1);
    Thread t4 = new Thread(customer2);

    t1.start();
    t2.start();
    t3.start();
    t4.start();
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章