Java 锁

时间:2020-01-09 10:36:27  来源:igfitidea点击:

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")。