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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

关于这下这段代码
我实在如果SET函数和GET函数不同步的话,编译可以,运行时会报错的。
可是这俩个线程要运行的时候要读while(flag)。这个语句不是已经能保证他们俩之中只有1个线程可以继续往下运行,另一个结果为真就会执行wait线程等待吗?

为什么还需要同步这两个函数呢?
求教,下面附上代码:
class ZiYuan
{
        private String name;
        private int num=1;
        private boolean flag=false;
       
        synchronized void set(String a)
        {
                while(flag)
                        try{wait();}catch(Exception e ){}
                this.name=a+"__"+num++;
                System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
                flag=true;
                this.notifyAll();
        }

               
        synchronized void get()
        {
                while(!flag)
                        try{wait();}catch(Exception e){}
                System.out.println(Thread.currentThread().getName()+"消费者。。。。。。。。。"+this.name);
                flag=false;
                this.notifyAll();
        }

       
}



class ZhiZao implements Runnable
{
        private ZiYuan z;
        ZhiZao(ZiYuan z)
        {
                this.z=z;
        }

        public void run()
        {
                while(true)
                {
                z.set("商品");
                }
        }

}



class XiaoShou implements Runnable
{
        private ZiYuan z;
        XiaoShou(ZiYuan z)
        {
                this.z=z;
        }
        public void run()
        {
                while(true)
                {
                        z.get();
                }
        }
}




class Sorry
{
        public static void main(String[] args)
        {
                ZiYuan z=new ZiYuan();
                ZhiZao zz=new ZhiZao(z);
                XiaoShou x=new XiaoShou(z);
                Thread t1=new Thread(zz);
                Thread t2=new Thread(zz);
                Thread t3=new Thread(x);
                Thread t4=new Thread(x);
                t1.start();
                t2.start();
                t3.start();
                t4.start();

       


       
        }
}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
up~~~~
求解~~
回复 使用道具 举报
UP~~~
求解~~
回复 使用道具 举报
本帖最后由 梁世喜 于 2012-10-15 15:38 编辑

毕老师的事例要实现的效果是  生产一个拿走一个,永远只能有一个生产一个在销售。
假设生产和销售都不是同步函数。
当某一瞬间销售者唤醒了所有进程(flag为false) ,线程1 在调用set()刚好打印完时(假设Cpu执行权被2拿到了。),线程2 调用了set(); 这就造成了同时生产两个。

同步函数在同一时间只能被一个线程调用,确保了函数在被调用过程中不可能被其他线程所执行。
(当线程1调用函数执行到一半,虽然线程2也有执行权,但函数却被线程1锁住了,所以不能执行)
确保了同一时间只能生产一个。
回复 使用道具 举报
synchronized 保证使用当前资源的唯一性;while()语句保证生产者生产产品或者销售者销售产品的唯一性。不知这样理解行不行。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马