码迷,mamicode.com
首页 > 编程语言 > 详细

2016年4月25日_JAVA学习笔记_Lock和Condition

时间:2016-04-25 17:59:48      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

1、在毕老师的视频里,首先介绍的是synchronized关键字作为同步,紧接着在多生产者和多消费者的例子当中就引出了Lock接口和Condition接口。而在书中是先介绍的Lock核Condition接口。我感觉Lock和Con接口比较复杂,相比于synchronized关键字来说需要做的事情太多,很繁琐,虽然功能可能强大很多,但是对于初学者来说先接触一个简单的关键字,从而学习到同步的概念是比较好的。

2、书中有一个简单的Lock接口例子

 1 private Lock myLock = new ReentrantLock();//创建一个Lock接口对象,不需要自己真的去实现这个接口,有现成的可以用
 2 
 3 public void method()
 4 {
 5     myLock.lock();//获取一个锁
 6     try    //必须检查异常
 7     {
 8         System.out.println();//线程的功能代码
 9     }
10     finally
11     {
12         myLock.unlock();//释放锁,写在finally当中以确保抛出异常时锁也能被正确的释放
13     }
14 }

 在这个例子当中可以看到如何使用Lock接口。我觉得相比synchronized关键字来说比较不爽的一点就是必须要写try...finally语句,这让整个程序变得比较臃肿。

3、关于Condition接口,毕老师的视频里说的比较通俗易懂。这个接口是一个监视器接口,在之前使用syn关键字时一个锁只能拥有一个监视器,就是这个锁本身。但是现在可以通过Condition接口来创建任意多的监视器接口,每一个监视器接口相互独立(一定意义上),下面是例子。

import java.util.concurrent.locks.*; 

class resrouce    //资源对象
{
    private String name;    //生产的物品
    private int count = 1;    //生产的编号
    private boolean flag = false;    //判断是否需要生产

    private Lock aLock = new ReentrantLock();//创建一个锁的对象,Lock是接口名称,R...Lock是一个实现了Lock的内部类
    private Condition set_con = aLock.newCondition();//创建生产资源线程的监视器
    private Condition out_con = aLock.newCondition();//创建消费资源线程的监视器
    public void set(String aName)    //资源类当中的生产资源方法
    {
        aLock.lock();    //获取一个锁,锁名为aLock
        try
        {
            while(flag)    //判断产品还在不在,如果还在就等待,不在就生产
            {
                try{set_con.await();}//使用生产者监视器的等待方法,区别于Object的wait()
                catch(InterruptedException e){}
            }
            name = aName + count++;
            System.out.println(Thread.currentThread().getName()+"...生产者"+this.name);
            flag = true;//表示生产完毕
            out_con.signal();//生产完毕后唤醒生产者的线程,而不是唤醒消费者的线程            
        }
        finally
        {
            aLock.unlock();    //释放一个锁,这个操作必须在final中使用,以防抛出异常后未释放锁
        }
    }

    public void out()
    {
        aLock.lock();
        try
        {
            while(!flag)
            {
                try{out_con.await();}    //使用消费者监视器的等待方法
                catch(InterruptedException e){}
            }
            System.out.println(Thread.currentThread().getName()+"...消费者...."+this.name);
            flag = false;
            set_con.signal();            
        }
        finally
        {
            aLock.unlock();
        }
    }
}

 

2016年4月25日_JAVA学习笔记_Lock和Condition

标签:

原文地址:http://www.cnblogs.com/pengjian-one/p/5431773.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!