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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马林贺 中级黑马   /  2012-5-27 22:00  /  2773 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  在介绍线程间通信的时候讲过一个生产者消费者的例子

    假如已经创建 one two  两个生产线程

  public synchronized void set(String name)
    {
          if(fiag)   //定义boolean 变量
       {
        try{this.wait()} catch(Exception e){}           // 问题在这里!
        }
       //省略下面代码  .......
    }
  为什么在讲的时候 当 one 线程等待执行后, two 线程就会执行起来  也会执行try 里面的内容 开始等待   
  函数 不是已经被 synchronized  修饰过了吗?  必须等 one 线程出去后 才能执行 two 线程吗?  
   求高人指导一下!

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
  求解释。。。。
回复 使用道具 举报
首先,方法上加入了synchroized关键字,则整个方法(方法中的代码块)的执行流程是同步的,即只有当一个线程执行完毕之后才能允许另外一个线程进入。
回复 使用道具 举报
wait()方法会释放该锁
回复 使用道具 举报
public synchronized void set(String name)
    {
          if(fiag)   //定义boolean 变量
       {
        try{this.wait()} catch(Exception e){}          // 当这个线程进入等待状态后,它不仅会释放执行权,而且还将不再持有锁,所以线程二就能执行下去了。        
       //省略下面代码  .......
    }

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 罗文杰 于 2012-5-28 02:18 编辑

这个方法被synchronized修饰过了,书面语就是同步过了。
我自己的理解就是上了个锁,首先一线程这个哥们一进来就把这锁给锁上了,这个时候其他线程的哥们想进来一看被锁住了,只能在外面干着急,当一线程这哥们执行到wait()时,他知道他该等一会儿,休息一会儿,但是你想他休息一会儿的时候,外面可有一群哥们在那狂叫唤要进来么,说句难听的- -他休息着的时候还不让人进来干活不就相当于拉完了屎还站着茅坑么,所以这个时候一线程这个哥们执行wait(),方法时候会把执行权释放掉,这时候这个锁就开了,其他哥们就能进来了,按照排队顺序(当然这也得看CPU老大的脸色- -!),线程二这哥们就进去执行了,不过这哥们进去也是先把这锁锁上了,其他哥们又在外面叫唤了,哈哈。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
明白了,谢谢大家了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马