A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 楚轩 中级黑马   /  2014-5-26 10:45  /  2321 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 楚轩 于 2014-5-27 09:18 编辑

class Resource
{
        private String product;
        private int count=1;
        private boolean flag=false;
        public synchronized void set(String product)
        {
                /*同步函数或代码块中,执行线程处于等待状态了,其它线程就可以进来,
                  求解答,最好能与Lock锁一并分析下   thanks   */
                while(flag)
                        try{wait();}catch(InterruptedException e){}
                this.product = product;
                System.out.println("生产者: "+product+count);
                flag = true;
                notifyAll();

        }
        public synchronized void out()
        {
                while(!flag)
                                try{wait();}catch(InterruptedException e){}
                System.out.println("消费者"+product+count++);
                flag = false;
                notifyAll();
        }
}

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

2 个回复

倒序浏览
个人见解,希望能帮到楼主。

Lock接口与Condition接口(也是JDk1.5的新特性)
Lock替代了synchronized;而Condition 替代了Object中的监视器方法(wait,notify,notifyall)使用,Condition可以通过Lock锁获取,一个Lock可以对应多个Condition
与之对应上面代码,我们只要更改Res类中代码如下:
class Resource
{
private String name;
        private int count = 1;
        private boolean flag = false;//定义标志,用于进程间切换
        private Lock lock = new ReentrantLock();
        private Condition con = lock.newCondition();
//private Condition con_pro = lock.newCondition();
//private Condition con_con = lock.newCondition();
//此处抛了异常,在处理线程时一定要记得做异常处理
        public void set(String name)throws InterruptedException
        {
                lock.lock();//上锁,lock()unlock()其实就类似于synchronized ,只是lock必须手动上锁和解锁
                try{
                        while(flag)
                                con.await();//线程等待,类似于wait
//con_pro.await();
                        this.name = name+"-->"+count++;
                        System.out.println("生产者.."+this.name);
                        flag = true;
                                con.signalAll();//唤醒全部线程,类似于notifyAll
//con_con.signal();
                }
                finally{
                        lock.unlock();//释放锁
                }
               
        }
//此处抛了异常,在处理线程时一定要记得做异常处理
        public void out()throws InterruptedException
        {
                lock.lock();//上锁
                try{
                        while(!flag)
                                con.await();//线程等待
//con_con.await();
                        System.out.println("消费者.."+this.name);
                        flag = false;
                        con.signalAll();//唤醒线程
//con_pro.signal();
                }
                finally{
                        lock.unlock();//释放锁
                }
        }
}
//以上注释的代码,实现了等待本方线程和只唤醒对方线程的功能。
  

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

回复 使用道具 举报
没壳的蜗牛 发表于 2014-5-26 11:18
个人见解,希望能帮到楼主。
Lock接口与Condition接口(也是JDk1.5的新特性)Lock替代了synchronized;而Co ...

挺到位的,很有帮助,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马