黑马程序员技术交流社区

标题: 多线程通信机制中同步与锁的一个疑问? [打印本页]

作者: 楚轩    时间: 2014-5-26 10:45
标题: 多线程通信机制中同步与锁的一个疑问?
本帖最后由 楚轩 于 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();
        }
}


作者: 没壳的蜗牛    时间: 2014-5-26 11:18
个人见解,希望能帮到楼主。

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();//释放锁
                }
        }
}
//以上注释的代码,实现了等待本方线程和只唤醒对方线程的功能。
  
作者: 楚轩    时间: 2014-5-27 09:18
没壳的蜗牛 发表于 2014-5-26 11:18
个人见解,希望能帮到楼主。
Lock接口与Condition接口(也是JDk1.5的新特性)Lock替代了synchronized;而Co ...

挺到位的,很有帮助,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2