黑马程序员技术交流社区

标题: 下面的程序,为什么两个类中的锁是同一个呢?求高手解答 [打印本页]

作者: 刘瑞    时间: 2014-7-30 01:11
标题: 下面的程序,为什么两个类中的锁是同一个呢?求高手解答
/*
问题:为什么Input和Output两个类中的r对象是同一个啊,也就是同一个锁。
既然是同一个对象,为什么要分别在两个类中进行初始化呢?
直接在Res类中初始化好不行吗?

*/
class Res
{
        String name;
        String sex;
        boolean flag = false;
}

class Input implements Runnable
{
        private Res r ;
        Input(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                int x = 0;
                while(true)
                {
                        synchronized(r)
                        {

                                if(r.flag)
                                        try{r.wait();}catch(Exception e){}
                                if(x==0)
                                {
                                        r.name="mike";
                                        r.sex="man";
                                }
                                else
                                {
                                        r.name="丽丽";
                                        r.sex = "女女女女女";
                                }
                                x = (x+1)%2;
                                r.flag = true;
                                r.notify();
                        }
                }
        }
}

class Output implements Runnable
{
        private Res r ;
       
        Output(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                {
                        synchronized(r)
                        {
                                if(!r.flag)
                                        try{r.wait();}catch(Exception e){}
                                System.out.println(r.name+"...."+r.sex);
                                r.flag = false;
                                r.notify();
                        }
                }
        }
}


class  InputOutputDemo
{
        public static void main(String[] args)
        {
                Res r = new Res();

                Input in = new Input(r);
                Output out = new Output(r);

                Thread t1 = new Thread(in);
                Thread t2 = new Thread(out);

                t1.start();
                t2.start();
        }
}


//notifyAll();

/*
wait:
notify();
notifyAll();




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