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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ztwztw 中级黑马   /  2013-12-17 09:03  /  1354 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class ProducecomsumerDemo
{
public static void main (Sting[] args)
{
Resource r=new Resource;
Produce pro=new Produce;
Consumer con=new Consumer;
Consumer t1=new Consumer(pro);
Consumer t2=new Consumer(pro);
Consumer t3=new Consumer(con);
Consumer t4=new Consumer(com);
t1,start;t2,start;t1,start;t1,start;
}
}
class Ressource
{
private sting name;
private int count=1;
private boolean flag=flase;
public synchronized void set (String name)
{
if(flag)
{
try(this.wait());
catch(Exception e){};
this.name=name+"......."+coun++;
system.out.println(this.getName()+"....生产者...."+this.name)
flag=ture;
this.notify();
}
}
}
  public synchronized void out()
{
if(!flag)
{
try(this.wait());
catch(Exception e){};

syetem.out.println(this.getName+"....消费者...."+this.name)
flag=flase;
this.notify;
}    }     
  class Prodncer implements Runable
{
private Resource res;
Producer (Resource res)
this.res=res;
public void run
{
while (true)
{res,set("...+商品...");
}
}
}   
class Consumer implements Runable
{
private Resource res;
Producer (Resource res)
this.res=res;
public void run
{
while (true)
{
res,out();
}
}
}   
在这个多线程中的同步函数中,如果t1进去执行了,出来的时候,flag变为ture,唤醒。这个时候如果t1还有执行权,去判断flag=true。等待。这个时候t2能进入同步函数中判断flag吗。                                                               

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

3 个回复

倒序浏览
你说的情况应该是这样的:
当t1生产者生产完一个产品后,唤醒消费者去消费。
然后消费者消费掉这个产品后,唤醒生产者继续生产。
但是此时生产者有t1和t2,他们要争夺CPU资源,谁抢到CPU执行权谁就进行生产。
这是t1抢到了CPU执行权,但是当t1进入同步代码块的时候wait()了,不能继续生产。
同步代码块的锁是this锁,t1和t2是不同的生产对象,他们的this肯定也就不一样了。
这个时候整个同步代码块的锁是t1对象的this锁,t2对象的有自己的this锁,所以这个时候t2肯定是不能进入这个同步代码块的。
回复 使用道具 举报
本帖最后由 75100313 于 2013-12-18 08:44 编辑

注释 是多么重要啊  你都不写注释  格式也没有  让我们新人怎么学啊
回复 使用道具 举报
可以的.
wait()方法:释放cpu执行权的同时也会释放锁;
sleep()方法只是放cpu执行权,不释放锁。
所以t1等待时会释放锁,t2是可以进来的.

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马