黑马程序员技术交流社区

标题: 线程死锁... [打印本页]

作者: jonn    时间: 2013-1-19 13:35
标题: 线程死锁...
本帖最后由 张向辉 于 2013-1-19 14:54 编辑
  1. class User
  2. {
  3.         private String name;
  4.         private float pay;
  5.         protected void setName(String name){
  6.                 this.name=name;
  7.         }
  8.         protected String getName(){
  9.                 return this.name;
  10.         }
  11.         protected void setPay(float pay){
  12.                 this.pay=pay;
  13.         }
  14.         protected float getPay(){
  15.                 return this.pay;
  16.         }
  17.         public boolean flag=false;
  18. }
  19. class AOper implements Runnable
  20. {
  21.         private User user;
  22.         AOper(User user){
  23.                 this.user=user;
  24.         }
  25.         public void run(){
  26.                
  27.                         while(true)
  28.                         {
  29.                          int i=0;
  30.                      synchronized(user){
  31.                                 if(user.flag)
  32.                                  try{user.wait();}catch(Exception e){}
  33.                                          if(i==0){
  34.                                            user.setName("zk");
  35.                                            user.setPay(9000f);
  36.                                           }else{
  37.                                                 user.setName("lii");
  38.                                                 user.setPay(12000f);
  39.                                           }
  40.                                   i=(i+1)%2;        
  41.                                   user.flag=true;
  42.                                   user.notify();
  43.                                 }
  44.                 }
  45.         }
  46. }
  47. class BOper implements Runnable
  48. {
  49.         private User user;
  50.         BOper(User user){
  51.                 this.user=user;
  52.         }
  53.         public void run(){
  54.                 synchronized(user){
  55.                         if(!user.flag)
  56.                            try{user.wait();}catch(Exception e){}
  57.                System.out.println("name:"+user.getName()+"--pay:"+user.getPay());
  58.                            user.flag=false;
  59.                            user.notify();
  60.                 }
  61.         }
  62. }
  63. class  UserTest
  64. {
  65.         public static void main(String[] args)
  66.         {
  67.                 User user=new User();
  68.                 AOper a=new AOper(user);
  69.                 BOper b=new BOper(user);
  70.         Thread t1=new Thread(a);
  71.                 Thread t2=new Thread(b);
  72.                 t1.start();
  73.                 t2.start();
  74.         }
  75. }   // 执行程序后一直等待.....成了死锁,怎么改呢?
复制代码

作者: 唐晓    时间: 2013-1-19 13:46
本帖最后由 唐晓 于 2013-1-19 14:14 编辑

BOper 类的run方法里加一个while(true),让他永久的运行,不然BOper类运行完一次后会挂那了
作者: 高浩    时间: 2013-1-19 13:50
为啥要搞锁的嵌套呢,想让两线程到一种和谐状态时及其不易的,开发中躲还来不及呢,
死锁的原因:出现了嵌套锁,一个线程进入了另一进不去,不会去执行,到最后两个线程都进行不了
程序就挂了
作者: txl    时间: 2013-1-19 14:12
同学你好,下面是我修改你的代码后的结果,里面有注释解释一些地方进行的改变
  1. class User
  2. {
  3.         private String name;
  4.         private float pay;
  5.         protected void setName(String name){
  6.                 this.name=name;
  7.         }
  8.         protected String getName(){
  9.                 return this.name;
  10.         }
  11.         protected void setPay(float pay){
  12.                 this.pay=pay;
  13.         }
  14.         protected float getPay(){
  15.                 return this.pay;
  16.         }
  17.         public boolean flag=false;
  18. }
  19. class AOper implements Runnable
  20. {
  21.         private User user;
  22.         AOper(User user){
  23.                 this.user=user;
  24.         }
  25.         public void run(){
  26.                 int i=0;          //这里应该把标记放在while(true)的外面,否则,i每次又都会等于0,else就执行不到
  27.                         while(true)
  28.                         {
  29.                         
  30.                      synchronized(user){
  31.                                 if(user.flag)
  32.                                  try{user.wait();}catch(Exception e){}
  33.                                          if(i==0){
  34.                                            user.setName("zk");
  35.                                            user.setPay(9000f);
  36.                                           }else{
  37.                                                 user.setName("lii");
  38.                                                 user.setPay(12000f);
  39.                                           }
  40.                                   i=(i+1)%2;        
  41.                                   user.flag=true;
  42.                                   user.notify();
  43.                                 }
  44.                 }
  45.         }
  46. }
  47. class BOper implements Runnable
  48. {
  49.         private User user;
  50.         BOper(User user){
  51.                 this.user=user;
  52.         }
  53.         public void run(){
  54.                 synchronized(user){
  55.                         while(true){                  //这里也需要使用while(true),之前是因为它只执行了一次
  56.                         if(!user.flag)
  57.                            try{user.wait();}catch(Exception e){}
  58.                System.out.println("name:"+user.getName()+"--pay:"+user.getPay());
  59.                            user.flag=false;
  60.                            user.notify();
  61.                 }
  62.                 }
  63.         }
  64. }
  65. class  UserTest
  66. {
  67.         public static void main(String[] args)
  68.         {
  69.                 User user=new User();
  70.                 AOper a=new AOper(user);
  71.                 BOper b=new BOper(user);
  72.         Thread t1=new Thread(a);
  73.                 Thread t2=new Thread(b);
  74.                 t1.start();
  75.                 t2.start();
  76.         }
  77. }   // 执行程序后一直等待.....成了死锁,怎么改呢?
复制代码

作者: jonn    时间: 2013-1-19 19:27
辉哥,不是不给力,没事发发滴{:soso_e141:},我这一般用Lock接口实现多线程
作者: Rancho_Gump    时间: 2013-1-19 19:33
赵文 发表于 2013-1-19 19:27
辉哥,不是不给力,没事发发滴,我这一般用Lock接口实现多线程

{:3_69:}{:3_48:}




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