java - Lock.tryLock() 的用例

标签 java multithreading concurrency locking

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

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 - Jframe 内的输入法?

java - 我是否正确地扩展了我的自定义 View ?

VB.net:我的线程安全列表解决方案真的安全吗?

python - 同时计算 Pandas 数据框

java - 首次使用 AndroidStudio 构建失败

java - 在默认包下创建一个新类

java - 安全地迭代一个被多线程访问的 ConcurrentHashMap

java - 为什么等待/通知没有发生在这里?

java - ReentrantLock 与 stampedlock 有什么区别?更喜欢哪一个?

java - 为什么 CyclicBarrier reset() 方法抛出 BrokenBarrierException