美文网首页
可重入锁

可重入锁

作者: 七月_JulyFY | 来源:发表于2019-08-23 10:17 被阅读0次

    Synchronized 与 ReenTrantLock (前2者都是悲观锁),2者都是可重入锁

    比如说A类中有个方法

    public synchronized methodA1(){
    
            methodA2();
    }
    
    而且
    
    public synchronized methodA2(){
    
                        //具体操作
    }
    

    也是A类中的同步方法,当当前线程调用A类的对象methodA1同步方法,如果其他线程没有获取A类的对象锁,那么当前线程就获得当前A类对象的锁,然后执行methodA1同步方法,方法体中调用methodA2同步方法,当前线程能够再次获取A类对象的锁,而其他线程是不可以的,这就是可重入锁。

    不可重入锁:

    public class Lock{
        private boolean isLocked = false;
        public synchronized void lock() throws InterruptedException{
            while(isLocked){    
                wait();
            }
            isLocked = true;
        }
        public synchronized void unlock(){
            isLocked = false;
            notify();
        }
    }
    
    
    使用该锁:
    
    public class Count{
        Lock lock = new Lock();
        public void print(){
            lock.lock();
            doAdd();
            lock.unlock();
        }
        public void doAdd(){
            lock.lock();
            //do something
            lock.unlock();
        }
        
    当前线程执行print()方法首先获取lock,接下来执行doAdd()方法就无法执行doAdd()中的逻辑,必须先释放锁。这个例子很好的说明了不可重入锁。
    

    ReentrantLock与synchronized比较:

    1.前者使用灵活,但是必须手动开启和释放锁

    2.前者扩展性好,有时间锁等候(tryLock( )),可中断锁等候(lockInterruptibly( )),锁投票等,适合用于高度竞争锁和多个条件变量的地方

    3.前者提供了可轮询的锁请求,可以尝试去获取锁(tryLock( )),如果失败,则会释放已经获得的锁。有完善的错误恢复机制,可以避免死锁的发生

    相关文章

      网友评论

          本文标题:可重入锁

          本文链接:https://www.haomeiwen.com/subject/tshosctx.html