Java中的显示锁ReentrantLock使用时机

 从Java 5.0开始,Java提供了访问共享对象的新机制:ReentrantLock。它实现了Lock接口:

  public interface Lock {

  void lock();

  void lockInterruptibly() throws InterrupttedException;

  boolean tryLock();

  boolean tryLock(long timeout, TimeUnitunit) throws InterruptedException;

  void unlock();

  Condition newCondition();

  }

  ReentrantLock提供了与synchronized相同的互斥和内存可见性的保证。获得ReentrantLock的锁与进入synchronized块有着相同的内存语义,释放ReentrantLock锁与退出synchronized块有相同的内存语义。

  那么为什么要创建与内存锁如此相似的机制呢?内存锁在大部分情况下能够很好的工作,但是有些功能上存在着局限:

  1)不能中断那些正在等待获取锁的进程,并且在请求锁失败的情况下,必须无限等待;

  2)内部锁必须在获取它们的代码块中被释放;这很好的简化了代码,但是在某些情况下,一个更灵活的加锁机制提供了更好的活跃度和性能。

  使用ReentrantLock的一般形式为:

  Lock lock = new ReentrantLock();

  ........

  lock.lock();

  try {

  //更新对象的状态

  //捕获异常,必要时恢复到原来的不变约束

  } finally {

  lock.unlock(www.37meishi.com);        //锁必须在finally块中释放

  }

  《Java并发编程实践》一书给出了使用ReentrantLock的最佳时机:

  当你需要以下高级特性时,才应该使用:可定时的、可轮询的与可中断的锁获取操作,公平队列,或者非块结构的锁。否则,请使用synchronized。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值