java 启动参数

-XX:+DontYieldALotInterval; bool;Interval in milliseconds between yields. (debug
only)
Thread.yield 是个 native 方法,具体由 JVM 实现,JVM 实现的源代码为:

C/C++ code
JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass))
JVMWrapper("JVM_Yield");
if (os::dont_yield()) return;
HS_DTRACE_PROBE0(hotspot, thread__yield);

// When ConvertYieldToSleep is off (default), this matches the classic VM use of yield.
// Critical for similar threading behaviour
if (ConvertYieldToSleep) {
os::sleep(thread, MinSleepInterval, false);
} else {
os::yield();
}
JVM_END


这个函数首先会调用 os::dont_yield() 函数,这个函数根据不同平台版本的 JVM 实现,有着不同的意义。

这个函数的调用结果是由一个称为 DontYieldALot 的 HotSpot JVM 参数决定的,这个参数在 Windows 和 Linux 平台上默认值为 false,在 Solaris 平台上默认值为 true。

1:在 Solaris 平台上的实现是:

Java code
bool os::dont_yield() {
if (DontYieldALot) {
static hrtime_t last_time = 0;
hrtime_t diff = getTimeNanos() - last_time;

if (diff < DontYieldALotInterval * 1000000)
return true;

last_time += diff;

return false;
}
else {
return false;
}
}


如果在 JVM 启用时强制设置 -XX:+DontYieldALot 参数时,则 Solaris 平台上会采用 os::sleep 模拟 yield 的功能,也就是让当前线程睡觉,睡觉的时间由 -XX:MinSleepInterval=?? 决定,默认值为 1 毫秒。如果连着两次调用 yield 的话,会使用 -XX:DontYieldALotInterval=?? 进行限制,默认值为 10 毫秒。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值