java.util.concurrent.locks.Lock Myth丶恋晨 2022-06-05 01:36 182阅读 0赞 # java.util.concurrent.locks.Lock # ## 概述 ## 锁实现提供了比使用同步方法和语句更广泛的锁操作。它们允许更灵活的结构,可能具有完全不同的属性,可能支持多个相关联的条件对象。 锁是通过多线程控制对共享资源的访问。一般来说,一把锁提供了对共享资源的独占访问权:一次只有一个线程可以获得锁,并且对所有共享资源的访问都需要先获得锁。然而,一些锁可能允许对共享资源的并发访问,像ReadWriteLock这样的读锁。 同步方法和语句的使用提供了对第一个对象相关联的隐式监听锁的访问,但是强制所有锁的获取与释放都要以块结构的方式进行,当获得多个锁时,他们必须以相反的顺序释放它们,而且所有锁必须在他们被捕获的同一词汇范围内被释放。 尽管同步方法和语句的范围机制使得使用监听锁编程更容易一些,而且帮助避免了许多涉及锁的常见的编程错误,有一些场合下你需要使用更灵活的方式使用锁一起工作。例如:一些用于遍历并发访问的数据结构需要使用“手动”或者“链锁”:你获取了节点A的锁,然后获取节点B,之后释放A获取C,接着释放B再获取D等等。锁接口的实现允许使用一把锁在不同的范围内获取和释放这样的技术,同时允许以任意的顺序获取和释放多个锁。 随着这种灵活性的提高带来的额外性的责任。块结构的锁移除了在同步方法和语句中出现的自动释放的锁的功能。多数情况下,应该使用下面的术语: lock l = …; l.lock(); try\{ // 通过这个锁被保护的资源 \} finally \{ l.unlock(); \} 当加锁和解锁出现在不同的范围内,必须确保所有被执行的代码都受到try-finally或者try-catch的保护,以确保在必要时释放锁。Lock实现通过提供一个非阻塞方法来获取一把锁(tryLock())提供了走出同步方法和语句的使用的额外的功能,试图获取一个被中断的锁(lockInterruptibly()),试图获取一个超时的锁(tryLock(long, TimeUnit)). 一个锁类还提供了和隐式监听锁完全不同的行为和主义,例如可保证的排序,不可重入的使用,死锁的检测。如果这些实现提供这样专业的语义,那么这些实现必须文档化这些语义。 注意,锁实例只是普通对象,可以在同步语句中使用它们作为目标。获取这些锁实例的监听锁与使用这些锁实例的lock()方法之间没有任何指定的关系。为了避免混淆,除了在它们自己的实现内,您绝对不要使用这种方式使用这些锁实例。 ## API设计 ## ![这里写图片描述][SouthEast] * lock(): 获取锁 * lockInterruptibly():除非当前线程被中断否则获取锁 * newCondition():返回一个绑定当前锁实例的Condition实例 * tryLock():如果在调用锁时,该锁是空闲的才获取锁 * tryLock(long time, TimeUnit unit):给给定的时间内锁实例是空闲的且当前线程没有被中断时获取锁 * unlock():释放锁 [SouthEast]: /images/20220605/2cdbfc95e3d04848902a64950e1f8402.png
还没有评论,来说两句吧...