zoukankan      html  css  js  c++  java
  • ReentrantLock和synchronized区别和联系?

    相同:ReentrantLock提供了synchronized类似的功能和内存语义,都是可重入锁。
     
    不同:
    1.ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此更有扩展性。在多个条件变量和高度竞争锁的地方,用ReentrantLock更合适,ReentrantLock还提供了Condition,对线程的等待和唤醒等操作更加灵活,一个ReentrantLock可以有多个Condition实例,所以更有扩展性。
    2.ReentrantLock必须在finally中释放锁,否则后果很严重,编码角度来说使用synchronized更加简单,不容易遗漏或者出错。
    3.ReentrantLock 的性能比synchronized会好点。
    4.ReentrantLock提供了可轮询的锁请求,他可以尝试的去取得锁,如果取得成功则继续处理,取得不成功,可以等下次运行的时候处理,所以不容易产生死锁,而synchronized则一旦进入锁请求要么成功,要么一直阻塞,所以更容易产生死锁。
     
    1、Lock的某些方法可以决定多长时间内尝试获取锁,如果获取不到就抛异常,这样就可以一定程度上减轻死锁的可能性。
    如果锁被另一个线程占据了,synchronized只会一直等待,很容易错序死锁 
    2、synchronized的话,锁的范围是整个方法或synchronized块部分;而Lock因为是方法调用,可以跨方法,灵活性更大 
    3、便于测试,单元测试时,可以模拟Lock,确定是否获得了锁,而synchronized就没办法了
     
     
    ReentrantLock比synchronized 强大在哪儿?
    简单说: 
    1、ReentrantLock可以实现fair lock 
     
    public ReentrantLock(boolean fair) {   
        sync = (fair)? new FairSync() : new NonfairSync();  
    }  
    所谓fair lock就是看获得锁的顺序是不是和申请锁的时间的顺序是一致的 
     
    2、ReentrantLock支持中断处理 
     
    public final void acquireInterruptibly(int arg) throws InterruptedException {  
        if (Thread.interrupted())  
            throw new InterruptedException();  
        if (!tryAcquire(arg))  
            doAcquireInterruptibly(arg);  
    }  
    就是说那些持有锁的线程一直不释放,正在等待的线程可以放弃等待。 
     
    3、ReentrantLock可以和condition结合使用 
     
    public boolean hasWaiters(Condition condition) {  
        if (condition == null)  
            throw new NullPointerException();  
        if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject))  
            throw new IllegalArgumentException("not owner");  
        return sync.hasWaiters((AbstractQueuedSynchronizer.ConditionObject)condition);  
    }  
     
    public int getWaitQueueLength(Condition condition) {  
        if (condition == null)  
            throw new NullPointerException();  
        if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject))  
            throw new IllegalArgumentException("not owner");  
        return sync.getWaitQueueLength((AbstractQueuedSynchronizer.ConditionObject)condition);  
    }  
  • 相关阅读:
    困扰我的c++语法
    C++ primer第三章作业
    渔夫捕鱼问题
    JAVA输入输出
    Python学习5——抽象,涉及抽象和结构、函数的自定义、参数、作用域、递归
    牛顿迭代法计算平方根
    Python学习4——条件、循环及其他语句总结
    Python补充1——Python的简单推导
    Python补充2——Python单行注释、整段注释使用方法
    Python补充3——Python中的 split() 函数
  • 原文地址:https://www.cnblogs.com/jiangyi-uestc/p/5893873.html
Copyright © 2011-2022 走看看