【发布时间】:2011-02-12 01:24:11
【问题描述】:
从 java 源代码来看,它看起来像是掉进了本机代码。成本大致相当于 volatile 读取还是需要获取某种类型的锁?
【问题讨论】:
-
我相信本机代码也是开源的,所以你可以检查那里发生了什么。
标签: java performance multithreading
从 java 源代码来看,它看起来像是掉进了本机代码。成本大致相当于 volatile 读取还是需要获取某种类型的锁?
【问题讨论】:
标签: java performance multithreading
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; }
【讨论】:
我不知道它是否获得了锁,但我进行了快速测试,对我来说isInterrupted() 比读取 volatile 变量慢大约 100 倍。现在这在你的申请中是否重要,我不能告诉你。
【讨论】: