黑马程序员技术交流社区

标题: 想运行状况想迷糊了。。。关于同步函数的问题 [打印本页]

作者: 王乐    时间: 2012-10-12 21:01
标题: 想运行状况想迷糊了。。。关于同步函数的问题
关于这下这段代码
我实在如果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();

       


       
        }
}

作者: 王乐    时间: 2012-10-13 12:55
up~~~~
求解~~
作者: 王乐    时间: 2012-10-15 13:23
UP~~~
求解~~
作者: 梁世喜    时间: 2012-10-15 15:37
本帖最后由 梁世喜 于 2012-10-15 15:38 编辑

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

同步函数在同一时间只能被一个线程调用,确保了函数在被调用过程中不可能被其他线程所执行。
(当线程1调用函数执行到一半,虽然线程2也有执行权,但函数却被线程1锁住了,所以不能执行)
确保了同一时间只能生产一个。
作者: 王梁星    时间: 2012-10-15 15:57
synchronized 保证使用当前资源的唯一性;while()语句保证生产者生产产品或者销售者销售产品的唯一性。不知这样理解行不行。




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