lock 的易错点

来源:互联网 发布:美国登月真假 知乎 编辑:程序博客网 时间:2024/06/12 19:28

如果按下面的方式写lock,你会发现lock并没有起到作用。

 public static class count{  // private int i ;   public  void get(){   final ReentrantLock lock = new ReentrantLock();                             //lock 声明在函数内   try{   lock.lock();   System.out.println(Thread.currentThread().getName()+"   get begin");   Thread.sleep(100);   System.out.println(Thread.currentThread().getName()+"   get end");   lock.unlock();   }catch(InterruptedException e){   e.printStackTrace();    }       }   public  void put(){   final ReentrantLock lock = new ReentrantLock();                             //lock 声明在函数内   try{   lock.lock();   System.out.println(Thread.currentThread().getName()+"   put begin");   Thread.sleep(100);   System.out.println(Thread.currentThread().getName()+"   put end");   lock.unlock();   }catch(InterruptedException e){   e.printStackTrace();    }       }   }

结果如下:

Thread-0   put beginThread-1   put beginThread-2   get beginThread-3   get beginThread-3   get endThread-0   put endThread-1   put endThread-2   get end

原因在于lock的声明在函数内,线程调用函数得到的lock值互不影响,所有并没有实现互斥。

改为如下:


public static class count{    final ReentrantLock lock = new ReentrantLock();                                    //lock 声明在函数外   public void get(){   try{   lock.lock();   System.out.println(Thread.currentThread().getName()+"   get begin");   Thread.sleep(1000);   System.out.println(Thread.currentThread().getName()+"   get end");   lock.unlock();   }catch(InterruptedException e){   e.printStackTrace();    }       }   public void put(){      try{   lock.lock();   System.out.println(Thread.currentThread().getName()+"   put begin");   Thread.sleep(1000);   System.out.println(Thread.currentThread().getName()+"   put end");   lock.unlock();   }catch(InterruptedException e){   e.printStackTrace();    }       }   }


结果如下:

Thread-0   get beginThread-0   get endThread-1   get beginThread-1   get endThread-2   put beginThread-2   put endThread-3   put beginThread-3   put end