zoukankan      html  css  js  c++  java
  • Synchronized 和 ReentrantLock (Lock )的区别

    1. 原始构成
      • Synchronized 是关键字,属于JVM层面,底层是通过 monitorenter 和 monitorexit 完成,依赖于 monitor 对象来完成。由于 wait/notify 方法也依赖于 monitor 对象,因此只有在同步块或方法中才能调用这些方法。
      • Lock 是 java.util.concurrent.locks.lock 包下的,是 api层面的锁。
    2. 使用方法
      • Synchronized 不需要用户手动释放锁,代码完成之后系统自动让线程释放锁
      • ReentrantLock 需要用户手动释放锁,没有手动释放可能导致死锁。
    3. 等待是否可以中断
      • Synchronized 不可中断,除非抛出异常或者正常运行完成
      • ReentrantLock 可以中断。一种是通过 tryLock(long timeout, TimeUnit unit),另一种是lockInterruptibly()放代码块中,调用interrupt()方法进行中断。
    4. 加锁是否公平
      • synchronized 是非公平锁
      • ReentrantLock 默认非公平锁,可以在构造方法传入 boolean 值,true 代表公平锁,false 代表非公平锁。
    5. 锁绑定多个 Condition
      • Synchronized 只有一个阻塞队列,只能随机唤醒一个线程或者唤醒全部线程。
      • ReentrantLock 用来实现分组唤醒,可以精确唤醒。




  • 相关阅读:
    事件(五):事件委托
    事件(四):事件类型
    【[ZJOI2005]午餐】
    【[POI2006]OKR-Periods of Words】
    【2^k进制数】
    【[SHOI2015]脑洞治疗仪】
    【[NOI2016]区间】
    【[SHOI2014]概率充电器】
    【逛公园】
    【[CQOI2014]数三角形】
  • 原文地址:https://www.cnblogs.com/tianziru/p/12856162.html
Copyright © 2011-2022 走看看