调用Thread.isInterrupted()的性能成本是多少?

8

从Java源代码来看,它似乎会转换为本地代码。它的成本是否大致相当于volatile读取,还是需要获取某种类型的锁定?


1
我相信用于的本地代码也是开源的,所以你可以检查一下那里发生了什么。 - pajton
3个回答

7
Thread.isInterrupted()是一个非常便宜的函数调用。虽然有一些额外的间接调用,但所有的调用都足够快速。总结一下:

Java必须通过执行双重间接调用Thread::current()->_osthread->_interrupted来模拟Thread.currentThread().isInterrupted()

来源

bool os::is_interrupted(Thread* thread, bool clear_interrupted) {
  assert(Thread::current() == thread || Threads_lock->owned_by_self(),
    "possibility of dangling Thread pointer");

  OSThread* osthread = thread->osthread();

  bool interrupted = osthread->interrupted();

  if (interrupted && clear_interrupted) {
    osthread->set_interrupted(false);
    // consider thread->_SleepEvent->reset() ... optional optimization
  }

  return interrupted;
}

OSThread 是这样实现的:

volatile jint _interrupted;     // Thread.isInterrupted state

// Note:  _interrupted must be jint, so that Java intrinsics can access it.
// The value stored there must be either 0 or 1.  It must be possible
// for Java to emulate Thread.currentThread().isInterrupted() by performing
// the double indirection Thread::current()->_osthread->_interrupted.
....
volatile bool interrupted() const                 { return _interrupted != 0; }

1
方法 isInterrupted 用于检查线程是否被中断,不会影响性能。如果线程已经被中断,它也不会重置。 另请参见以下链接: 链接文本 链接文本

1

我不知道它是否获取了锁,但我进行了快速测试,对我来说isInterrupted()比读取易失性变量慢大约100倍。现在,无论在您的应用程序中是否重要,我不能告诉您。


@Michael:我进行了非常粗略的测试。基本上只是循环几百万次,在循环中调用isInterrupted()进行第一次测试,然后读取变量进行第二次测试。没有涉及到其他线程。我还保留了该值的引用,以防循环被优化掉。 - JRL
1
小心微基准测试!特别是在JVM上。有许多因素可以轻松地扭曲结果。理想的做法是在您的应用程序中实现它并进行真正的测试。更多细节请参见http://www.ibm.com/developerworks/java/library/j-jtp02225.html。 - mdma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接