链接:https://www.nowcoder.com/questionTerminal/5438923ad3b941308c33e7300472abca?orderByHotValue=0&mutiTagIds=639&page=9&onlyReference=false
来源:牛客网
所谓的释放锁资源实际是通知对象内置的monitor对象进行释放,而只有所有对象都有内置的monitor对象才能实现任何对象的锁资源都可以释放。又因为所有类都继承自Object,所以wait()就成了Object方法,也就是通过wait()来通知对象内置的monitor对象释放,而且事实上因为这涉及对硬件底层的操作,所以wait()方法是native方法,底层是用C写的。
wait、sleep、yield、join这四个方法中,除了wait方法属于Object类,其他都是Thread所有,所以其他3个是没有资格释放资源的,而join()有资格释放资源其实是通过调用wait()来实现的。
代码如下:
wait()方法
public final native void wait(long timeoutMillis) throws InterruptedException;
join()方法
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}