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

© ilvsoft 中级黑马   /  2014-4-25 19:48  /  964 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题:刚开始没有同步的时候,运行结果可能回事mike------女女等等这些
说明线程t1再 运行s.nme=mike就被t2抢到执行权则输出mike----女女
而有了同步后,t1运行到s。name=mike时被t2抢到执行权,但是t2判断有锁锁住的于是就没有输出,然后又到t1抢到执行权后,s。sex=nannan,锁打开,t2抢到执行权输出mike-----nannan

所以t1在wait()后,t2获得执行权后 应该判断是有锁的,所以不能输出,例如Input中s。b为真,于是就wait();t2得到执行权后判断是有锁的,应该根本就执行不到if(!s。b) 才对啊,感觉这里好矛盾啊,



package Thread;

public 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();
        }
}

class Res
{
        String name;
        String sex;
        boolean b=true;
}
class Input implements Runnable
{
        private Res s;
        public Input(Res s)
        {
                this.s=s;
        }
        public void run()
        {
                int x=0;
                int count=0;
                while(true)
                {
                        synchronized (s) {
                               
                                if(s.b)
                                {
                                        try{s.wait();}
                                        catch(Exception e){}
                                }
                                       
                                if(x==0)
                                {
                                               
                                        s.name="mike";
                                        try{Thread.sleep(10);}
                                        catch(Exception e){}
                                        s.sex="man";
                                }
                                else
                                {
                                        try{Thread.sleep(10);}
                                        catch(Exception e){}                                                s.name="丽丽";
                                        s.sex="女女";
                                }
                                s.b=!s.b;
                                try{s.notify();}//唤醒的是Output中s对象的线程
                                catch(Exception e){}
                               
                               
                        }
                        /*if(x==0)
                        {
                               
                                s.name="mike";
                                try{Thread.sleep(10);}
                                catch(Exception e){}
                                s.sex="man";
                        }
                        else
                        {
                                try{Thread.sleep(10);}
                                catch(Exception e){}
                                s.name="丽丽";
                                s.sex="女女";
                        }*/
                        x=(x+1)%2;
                        if(count++>100)
                                break;
                }
               
        }
}

class Output implements Runnable
{
        private Res s;
        public Output(Res s)
        {
                this.s=s;
        }
        public void run()
        {
                int count=0;
                while(true)
                {
                        try{Thread.sleep(10);}
                        catch(Exception e){}
                        synchronized (s) {
                                if(!s.b)
                                {
                                        try{s.wait();}
                                        catch(Exception e){}
                                }
                                       
                                System.out.println(s.name+"...."+s.sex);
                                s.b=!s.b;
                                try{s.notify();}//唤醒的是Input中s对象的线程
                                catch(Exception e){}
                               
                               
                        }
                        //System.out.println(s.name+"...."+s.sex);
                        if(count++>100)
                                break;
                }
        }

1 个回复

倒序浏览
结贴,想通了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马