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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

想了一个晚上都不明白,按照以下代码为什么会重复打印man或者重复打印女女女女女女,按理说不是轮流打印吗,求解析,万分感激


class InperOurperDemo
{
        public static void main(String[] args)
        {
                Res r = new Res();
                Thread t1 = new Thread(new Inper(r));
                Thread t2 = new Thread(new Ourper(r));
                t1.start();
                t2.start();
        }
}

class Res
{
        String name;
        String sex;
        boolean flag;
}

class Inper implements Runnable
{
        private Res r;
        Inper(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                int x=0;
                while(true)
                {
                        if (r.flag)
                                {
                                try{r.wait();} catch(Exception e){}
                                }
                        synchronized(r)
                        {
                                if (x==0)
                                {
                                        r.name="mike";
                                        r.sex="man";
                                }
                                else
                                {
                                        r.name= "丽丽";
                                        r.sex= "女女女女女女";
                                }
                                x=(x+1)%2;
                                
                                r.flag = true;
                                r.notify();
                        }
                }
        }
}

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

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
指向的是2个对象.不是同一个对象.无法获得多线程并发访问.无法交替打印.必须是按顺序结构执行语句.
回复 使用道具 举报
class InperOurperDem
{
         public static void main(String[] args)
        {
                 Res r = new Res();
                 Thread t1 = new Thread(new Inper(r));
                 Thread t2 = new Thread(new Ourper(r));
                 t1.start();
                 t2.start();
        }
}

class Res
{
         String name;
         String sex;
         boolean flag;
}

class Inper implements Runnable
{
         private Res r;
         Inper(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 Ourper implements Runnable
{
     private Res r;
     
     Ourper(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();
            }
         }
     }
}

wait  notify  notify这些方法都必须定义在同步中,因为这些是操作线程的防线,必须要明确操作的是哪个锁上的线程。
回复 使用道具 举报
class InperOurperDemo
{
        public static void main(String[] args)
        {
                Res r = new Res();
                Thread t1 = new Thread(new Inper(r));
                Thread t2 = new Thread(new Ourper(r));
                t1.start();
                t2.start();
        }
}

class Res
{
        String name;
        String sex;
        boolean flag;
}

class Inper implements Runnable
{
        private Res r;
        Inper(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                int x=0;
                while(true)
                        {
                                     synchronized(r)//注意要把锁定在if判断语句以外,while循环中的内容都需要上锁同步
                                     {
                                            
                                        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 Ourper implements Runnable
{
        private Res r;
        
        Ourper(Res r)
        {
                this.r = r;
        }
        public void run()
        {
               
                while(true)
                {
                                synchronized(r)//while循环中的内容都需要上锁同步
                            {
                                                if(!r.flag)
                                        {
                                        try{r.wait();}catch(Exception e){}
                                        }
                        
                                System.out.println(r.name+"........"+r.sex);
                                r.flag = false;
                                r.notify();
                        }
                }
        }
}
注意:while循环中的内容都需要同步,要把锁上在所有需要同步的语句以外。
回复 使用道具 举报
class InperOurperDemo
{
        public static void main(String[] args)
        {
                Res r = new Res();
                Thread t1 = new Thread(new Inper(r));
                Thread t2 = new Thread(new Ourper(r));
                t1.start();
                t2.start();
        }
}

class Res
{
        String name;
        String sex;
        boolean flag;
}

class Inper implements Runnable
{
        private Res r;
        Inper(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                int x=0;
                while(true)
                        {
                                     synchronized(r)//注意要把锁定在if判断语句以外,while循环中的内容都需要上锁同步
                                     {
                                            
                                        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 Ourper implements Runnable
{
        private Res r;
        
        Ourper(Res r)
        {
                this.r = r;
        }
        public void run()
        {
               
                while(true)
                {
                                synchronized(r)//while循环中的内容都需要上锁同步
                            {
                                                if(!r.flag)
                                        {
                                        try{r.wait();}catch(Exception e){}
                                        }
                        
                                System.out.println(r.name+"........"+r.sex);
                                r.flag = false;
                                r.notify();
                        }
                }
        }
}
注意:while循环中的内容都需要同步,要把锁上在所有需要同步的语句以外。
回复 使用道具 举报
class InperOurperDemo
{
        public static void main(String[] args)
        {
                Res r = new Res();
                Thread t1 = new Thread(new Inper(r));
                Thread t2 = new Thread(new Ourper(r));
                t1.start();
                t2.start();
        }
}

class Res
{
        String name;
        String sex;
        boolean flag;
}

class Inper implements Runnable
{
        private Res r;
        Inper(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                int x=0;
                while(true)
                        {
                                     synchronized(r)//注意要把锁定在if判断语句以外,while循环中的内容都需要上锁同步
                                     {
                                            
                                        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 Ourper implements Runnable
{
        private Res r;
        
        Ourper(Res r)
        {
                this.r = r;
        }
        public void run()
        {
               
                while(true)
                {
                                synchronized(r)//while循环中的内容都需要上锁同步
                            {
                                                if(!r.flag)
                                        {
                                        try{r.wait();}catch(Exception e){}
                                        }
                        
                                System.out.println(r.name+"........"+r.sex);
                                r.flag = false;
                                r.notify();
                        }
                }
        }
}
注意:while循环中的内容都需要同步,要把锁上在所有需要同步的语句以外。
回复 使用道具 举报
焦健 高级黑马 2012-12-6 21:37:31
7#
class InperOurperDemo
{
        public static void main(String[] args)
        {
                Res r = new Res();
                Thread t1 = new Thread(new Inper(r));
                Thread t2 = new Thread(new Ourper(r));
                t1.start();
                t2.start();
        }
}

class Res
{
        String name;
        String sex;
        boolean flag;
}

class Inper implements Runnable
{
        private Res r;
        Inper(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                int x=0;
                while(true)
                        {
                                     synchronized(r)//注意要把锁定在if判断语句以外,while循环中的内容都需要上锁同步
                                     {
                                            
                                        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 Ourper implements Runnable
{
        private Res r;
        
        Ourper(Res r)
        {
                this.r = r;
        }
        public void run()
        {
               
                while(true)
                {
                                synchronized(r)//while循环中的内容都需要上锁同步
                            {
                                                if(!r.flag)
                                        {
                                        try{r.wait();}catch(Exception e){}
                                        }
                        
                                System.out.println(r.name+"........"+r.sex);
                                r.flag = false;
                                r.notify();
                        }
                }
        }
}
注意:while循环中的内容都需要同步,要把锁上在所有需要同步的语句以外。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马