java - Lock.tryLock() 的用例

原文 标签 java multithreading concurrency locking

API docsLock方法接口(interface) tryLock() ,粘贴此代码示例,

A typical usage idiom for this method would be:

  Lock lock = ...;
  if (lock.tryLock()) {
      try {
          // manipulate protected state
      } finally {
          lock.unlock();
      }
  } else {
      // perform alternative actions
  }


我的问题是,这个用例在 Java 5 之前是否不存在,或者人们曾经通过其他一些技术来实现它?

我无法理解需要执行 执行替代操作 基于锁的可用性。

有人可以解释一下实际用例吗?

我确信这种技术不是 synchronized 的直接替代品编写无死锁的代码。

最佳答案

一个简单的用例是一个线程处理一批元素,偶尔尝试提交已处理的元素。如果获取锁失败,元素将在下一次成功尝试或最终强制提交时提交。

另一个示例可以在 JRE 本身中找到, ForkJoinTask.helpExpungeStaleExceptions() 是一种执行可以由任意线程完成的任务的方法,但一次只能执行一个任务,因此只有成功获取锁的一个线程会执行它,所有其他线程都会返回,因为锁不可用意味着有已经是一个执行任务的线程。

如果将不支持可选的内在锁定功能与可以表示为普通对象状态的锁定逻辑分开,则可以在 Java 5 之前实现类似的功能。 This answer提供了一个例子。

关于java - Lock.tryLock() 的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41788074/

相关文章:

java - 如何使用Jackson来反序列化对象数组

去旅游#5 : select statement example

php - 如何在PHP中处理并发请求(使用-线程,线程池或子进程)

python - 调试 PyThread_acquire_lock 死锁

java - 抽象和封装与性能不一致 - 如何?

java - Java MemoryClassLoader(IllegalArgumentException)

java - 为什么从 servlet 转发到 JSP 时必须使用正斜杠?

java - 在 Spring 中格式化 BigDecimal

c++ - C++套接字接收混合消息

c++ - 这是 boost 条件变量的正确使用吗?