黑马程序员-JDK1.5多线程安全解决方案Lock详解

来源:互联网 发布:linux下运行c 编辑:程序博客网 时间:2024/05/21 09:07

------- android培训、java培训、期待与您交流! ----------

/*
 * 在jdk1.5中提供了多线程解决方案
 * 将同步的synchronized 替换成现实中的lock操作
 * Lock 接口:它的出现替代了同步代码块或者同步函数,将同步隐世锁操作变成了显示锁操作
 * 同时更加灵活,可以一个锁上加上多组监听器
 * lock():获取锁
 * unlock(): 释放锁,通常要定义到finally代码块中
 *
 * Condition接口:它的出现替代了Object 中的wait、notify、notifyAll方法
 *     将这些监听器单独进行了封装,变成了Condition监听器对象
 *     可以任意锁组合
 * await() 等待
 * signal() 唤醒一个等待线程
 * signalAll() 唤醒所有等待线程
 * */
//事例
class Resource{
 private String name;
 private int count=1;
 private boolean flag=false;
 //创建一个锁对象
 Lock lock = new ReentrantLock();
 //通过已有的锁,获取该锁上的监听器对象
 //Condition con = lock.newCondition();
 //通过已有的锁,获取两组监听器;一组是监听生产者,一组监听消费者
 Condition producer_con=lock.newCondition();
 Condition consumer_con=lock.newCondition();
 public void set(String name){
  lock.lock();
   while(flag){
    try{
     producer_con.await();
    }
    catch(Exception e){}
    this.name=name+count;
    count++;
    System.out.println(Thread.currentThread().getName()+"---生产者---"+this.name);
   }
  
 }
 public void get(){
  lock.lock();
  while(!flag){
   try {
    consumer_con.await();
   } catch (Exception e) {
    // TODO: handle exception
   }
   System.out.println(Thread.currentThread().getName()+"消费者"+this.name);
   flag=false;
   producer_con.signal();
  }
  
 }
 
}
class Producer implements Runnable  
{  
    private Resource r;  
    Producer(Resource r)       {  
        this.r=r;  
   }  
    public void run()  
    {  
        while (true)  
        {  
            r.set("烤鸭");  
        }  
    }  
}  
class Consumer implements Runnable  
{  
    private Resource r;  
    Consumer(Resource r)  
    {  
        this.r=r;  
    }  
    public void run()  
    {  
        while (true)  
        {  
            r.get();  
        }  
    }  
}  
class  ProducerConsumerDemo  
{  
   public static void main(String[] args)   
    {  
        Resource r=new Resource();  
        Producer pro=new Producer(r);  
        Consumer con=new Consumer(r);  
        Thread t0=new Thread(pro);  
        Thread t1=new Thread(con);  
        Thread t2=new Thread(pro);  
        Thread t3=new Thread(con);  
        t0.start();  
        t1.start();  
        t2.start();  
        t3.start();  
    }  

------- android培训、java培训、期待与您交流! ----------

 
原创粉丝点击