Java 锁
Javautil.concurrent.locks.Lock
是一种线程同步机制,就像synchronized
块一样。但是,"锁"比同步块更灵活,更复杂。
顺便说一句,在我的Java并发性教程中,我描述了如何实现自己的锁,以防我们感兴趣(或者需要)。有关更多详细信息,请参见我在"锁"上的文字。
Java锁示例
由于"锁"是一个接口,因此我们需要使用其一种实现在应用程序中使用"锁"。这是一个简单的用法示例:
Lock lock = new ReentrantLock(); lock.lock(); //critical section lock.unlock();
首先创建一个"锁"。然后调用它的" lock()"方法。现在,Lock
实例已被锁定。任何其他调用lock()
的线程都将被阻塞,直到锁定该锁的线程调用了unlock()
。最后调用unlock()
,并且Lock
现在被解锁,以便其他线程可以锁定它。
Java锁实现
java.util.concurrent.locks
包具有Lock
接口的以下实现:
- 重入锁
锁和同步块之间的主要区别
Lock和同步块之间的主要区别是:
- 同步块不保证等待进入该块的线程的访问顺序。
- 我们不能将任何参数传递给同步块的条目。因此,无法尝试访问同步块的超时。
- 同步块必须完全包含在一个方法中。一个Lock可以在单独的方法中调用到lock()和unlock()。
锁方法
Lock接口具有以下主要方法:
- lock()
- lockInterruptibly()
- tryLock()
- tryLock(long timeout, TimeUnit timeUnit)
- unlock()
如果可能的话,lock()
方法会锁定Lock
实例。如果"锁"实例已经被锁定,则调用"锁()"的线程将被阻塞,直到"锁"被解锁。
除非调用该方法的线程已被中断,否则lockInruptible()方法将锁定Lock。另外,如果某个线程被阻塞,等待通过此方法锁定Lock
,并且该线程被中断,则退出此方法调用。
tryLock()方法尝试立即锁定Lock实例。如果锁定成功,则返回" true",如果已经锁定" Lock",则返回false。此方法永远不会阻塞。
tryLock(long timeout,TimeUnit timeUnit)的工作方式与tryLock()方法类似,只是它在放弃给定的锁之前试图等待给定的超时。
unlock()
方法解锁Lock
实例。通常,Lock
实现仅允许已锁定Lock
的线程调用此方法。其他调用此方法的线程可能会导致未经检查的异常(" RuntimeException")。