关于可重入锁的原理及简单实现

关于并发包当中的ReenTrantLock 的实现等我研究完ConcurrentHashMap 之后再看看

可重入锁使用的目的:

        保证线程访问时的线程安全;

与普通锁的区别:

        可重入锁可以避免线程死锁


场景描述:多线程访问场景,其中获得了锁的线程可能重复获得锁   

即:  Thread1  --->lock     Thread2 ---> wait()   Thread3 ----> wait()     Thread4 ---> wait()   

         Thread1 ---->lock  (重复加锁  如果解锁过程只有一次 则造成死锁)  


public  class  Lock{

        boolean  isLocked  =  false;

        Thread  lockBy  =  null  ;

         int   lockCount  =  0;

         public  synchronized  void  lock ()  {                ////////加锁方式

                Thread  thread  =  Thread.currentThread();

                while(  isLocked  &&  lockBy != thread ){

                            wait () ;

                 }

                isLocked = true ;

                lockCount ++ ;

                lockBy = thread; 

       } 


       public  synchronized  void  unlock () {

               if ( Thread . currentThread (  )  == this . lockBy )  {

                        lockCount --;                  //////////  防止出现获得了锁的线程双重加锁后   却只解锁一遍  造成死锁

                        if ( lockCount == 0 ) {

                                isLocked  =  false ;

                                notify();

                        }    

                }

        }


}

你可能感兴趣的:(关于可重入锁的原理及简单实现)