【问题标题】:Java: LockSupport.parkNanos vs Thread.sleep(...)Java:LockSupport.parkNanos 与 Thread.sleep(...)
【发布时间】:2012-05-01 12:51:35
【问题描述】:

在某些情况下,我们大多数人都会这样写:

try {
   Thread.sleep(2000); 
} catch (InterruptedException e) {
   ; // do nothing
}

无论是对还是错,仅在某些测试工具中可接受,这不是我的观点。 我的观点是,同样的代码可以写得更简洁,如下:

  LockSupport.parkNanos(2000* 1000000);

有什么理由让我偏爱一种方法而不是另一种方法。

【问题讨论】:

  • 我最初的想法是,我发现 2000ms 比 2000 * 1000000 ns 要容易得多!

标签: java multithreading


【解决方案1】:

可读性:Thread.sleep 具有非常直观的含义。您将如何描述(向其他开发人员)您对LockSupport.parkNanos 的使用?如果该描述主要包含“我希望当前的线程 睡眠”,那么Thread.sleep 肯定更具描述性。

简洁性来自于缺少中断处理——所以如果你愿意,可以创建一个包装器方法来执行此操作,它将异常作为RuntimeException 传播。哎呀,如果你正在创建一个包装方法,你可以使用任何一种实现,尽管另一个线程当然可以unpark你的“睡眠”线程,就像它可以中断它一样...... p>

【讨论】:

  • 主要区别不是sleep处理器可以将上下文切换到另一个线程,而park只等待一段时间(几乎就像循环与nul操作)? (没有上下文切换 - 大量开销)
  • @razor:不,我不认为是这样 - 至少,文档没有明确说明它是自旋锁。
【解决方案2】:

parkNanos 方法的文档提供了该方法可以返回的条件。这些条件之一是:调用虚假(即无缘无故)返回。因此,如果您不介意虚假唤醒和其他一些线程“取消停放”正在考虑的等待线程,那么基本上可以使用它。当然,Jon 的评论几乎指出了偏爱一个胜过另一个的原因。

【讨论】:

  • 我知道这个答案已经过时,但它仍然可以帮助开发人员寻找更多关于 LockSupport 的见解。为了完成,这里有一篇很好的文章,展示了这些虚假返回的样子:hazelcast.com/blog/… TLDR:调用可能会在几微秒后返回,具体取决于 JVM(HotSpot、Dalvik、IBM)甚至主机。
【解决方案3】:

LockSupport 的应用范围更有限,不支持异常处理。如果您只需要锁定一个线程,就可以了。

来自 API:

这些方法旨在用作创建工具 更高级别的同步实用程序,它们本身并不 适用于大多数并发控制应用程序。

【讨论】:

  • 大多数时候异常处理几乎是无用的。编码器可以保证线程不会被中断......因此我的问题
猜你喜欢
  • 1970-01-01
  • 2010-11-27
  • 2013-04-28
  • 2012-03-24
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
相关资源
最近更新 更多