/* * @since 1.5 * @author Doug Lea */public interface Lock { /** * 获取锁 * * 如果锁无法提供,当前线程禁止后面的执行计划,休眠直到锁可以被获取。错误的使用lock,比如一个执行方法可能造成死锁,或者在各种情况下 * 抛出一个异常或者未捕获异常。这些情况或者异常类型需要在实现文档中声明 * * 实现注意事项:一个Lock接口的实现可能需要察觉到 */ void lock(); /** * 获取锁,直到当前线程被中断(调用Thread.interrupt()) * * 获取锁如果锁是可以获取的,并且理解返回。如果锁不能被获取,当前线程禁止后面的执行计划,休眠直到发生下面的两种情况之一: * 1.锁可以被当前线程获取 * 2.其它的线程中断当前线程并且中断锁的获取是被允许的 * 如果当前线程发生以下两种情形之一都会抛出InterruptedException异常,并且当前线程的中断状态将会被清除: * 1.当前线程的中断状态在设置中时进入该方法 * 2.或者在获取锁的途中中断状态被设置了并且中断锁的获取操作是被允许的 * * 实现注意事项: * * 中断一个锁的获取的能力在一些实现中或许不允许,并且允许中断锁的操作可能是昂贵的,程序员需要意识到这种情况是有问题的。实现需要文档说明这种问题 * * 实现可以响应一个中断,结束时正常返回 * * Lock实现或许能察觉到使用Lock时的问题,比如执行时造成的死锁,或许会抛出抛出(未捕获)异常的情况。 * 这些情况或者异常类型需要在实现文档中声明 * @throws InterruptedException 如果当前线程在获取锁的时候被中断(而且中断一个锁的获取是被允许的) */ void lockInterruptibly() throws InterruptedException; /** * 只有在执行时锁是空闲的才获取锁 * * 如果锁是可以获取的,马上返回true;如果锁不允许获取,马上返回false; * * 该方法经典使用习惯 * Lock lock = ...; * if (lock.tryLock()) { * try { * // manipulate PRotected state * } finally { * lock.unlock(); * } * } else { * // perform alternative actions * }} * * 该用法确保在获取锁以后释放锁,并且不会在锁不可获取的时候去释放锁 * * @return true 如果锁是可以获取,否则返回false */ boolean tryLock(); /** * 如果锁是在给定的等待时间区间空闲的并且当前线程没有被中断(Thread.interrupt(),获取锁 * * 如果锁是可以被获取的该方法马上返回true * 如果锁不能被获取,当前线程禁止后面的执行计划,休眠直到发生下面的3种情况之一发生: * 1.锁被当前线程获取到了 * 2.其它线程中断了当前线程,并且中断锁的获取是被允许的 * 3.指定的等待时间消耗完了 * * * 如果锁已经是当前线程获取的,马上返回true * * 如果当前线程发生以下两种情形之一都会抛出InterruptedException异常,并且当前线程的中断状态将会被清除: * 1.当前线程的中断状态在设置中时进入该方法 * 2.或者在获取锁的途中中断状态被设置了并且中断锁的获取操作是被允许的 * * 如果指定的等待时间消耗完了返回false;如果时间大于等于0,该方法不会再继续等待 * * 实现注意事项: * * 中断一个锁的获取的能力在一些实现中或许不允许,并且允许中断锁的操作可能是昂贵的, * 程序员需要意识到这种情况是有问题的。实现需要文档说明这种问题 * * 实现可以响应一个中断,结束时正常返回, 或者返回超时. * * Lock实现或许能察觉到使用Lock时的问题,比如执行时造成的死锁,或许会抛出抛出(未捕获)异常的情况。 * 这些情况或者异常类型需要在实现文档中声明 * * @param time 获取锁的最大等待时间 * @param unit time参数的时间单位 * @return 获取到锁返回true ,返回false如果锁是在给定的等待时间区间没有获取到 * * @throws 如果当前线程在获取锁的时候被中断(而且中断一个锁的获取是被允许的) */ boolean tryLock(long time, TimeUnit unit) throws InterruptedException; /** * 释放锁 * * 实现注意事项: * * 一个Lock的实现通常会利用约束限制哪个线程可以释放一个锁(代表性的只有锁的拥有者可以释放它,如果违反了约束可以抛出一个 * (unchecked异常)异常,如何约束和异常都需要在文档中标明 */ void unlock(); /** * 返回一个Condition对象绑定到本Lock对象 * * 在等待condition对象返回前,锁必须由当前对象持有 * 一个Condition#await()调用会自动释当前线程获取的锁,wait会在等待和重新获取锁之前返回 * * 实现注意事项: * 要具体操作Condition对象依赖于Lock实现,并且在实现中要写明 * * * @return A new {@link Condition} instance for this {@code Lock} instance * @throws UnsupportedOperationException if this {@code Lock} * implementation does not support conditions */ Condition newCondition();}
新闻热点
疑难解答