Object.wait调用的是share/vm/prims/jvm.cpp中的JVM_MonitorWait。
void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
{
Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
ObjectSynchronizer::wait(obj, ms, CHECK);
}
在此先看不用偏向锁的情况
void ObjectSynchronizer::wait(Handle obj, jlong millis, TRAPS) {
...........
ObjectMonitor* monitor = ObjectSynchronizer::inflate(THREAD, obj());//获取监视器
monitor->wait(millis, true, THREAD);//等待相应的时间
}
看看等待的具体实现
void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) {
.........
ObjectWaiter node(Self);
node.TState = ObjectWaiter::TS_WAIT ;
Self->_ParkEvent->reset() ;
OrderAccess::fence();
//上面是创建一个等待的节点,准备放入等待队列中
Thread::SpinAcquire (&_WaitSetLock, "WaitSet - add") ; //进入临界区
AddWaiter (&node) ; //将等待节点加入等待队列
Thread::SpinRelease (&_WaitSetLock) ; //离开临界区
.............
exit (Self) ; //退出监视器,这地方操作蛮复杂的,在这个方法里面判断线程是否有锁
//THREAD->is_lock_owned((address) _owner),如果没有锁抛出异常
//IllegalMonitorStateException,所以说这里需要wait方法里面在synchronized块内
//执行完exit,也就释放了锁,允许其他线程进入synchronized块
if (node._notified != 0 && _succ == Self) { //这一步是考虑别的线程已经进入上面的exit?
node._event->unpark();
}
............
if (node._notified == 0) { //线程在此等待
if (millis <= 0) {
Self->_ParkEvent->park () ;
} else {
ret = Self->_ParkEvent->park (millis) ;
}
}
//运行到这,意味着线程已经被唤醒
if (node.TState == ObjectWaiter::TS_WAIT) {
Thread::SpinAcquire (&_WaitSetLock, "WaitSet - unlink") ;
if (node.TState == ObjectWaiter::TS_WAIT) {
DequeueSpecificWaiter (&node) ; // 移出等待队列
node.TState = ObjectWaiter::TS_RUN ; //修改标记为TS_RUN
}
Thread::SpinRelease (&_WaitSetLock) ;
}
............
//下面几句是线程重新获得锁,这里是因为上面的exit已经释放了锁,允许别的线程进入了
//synchronized块,所以要重新获取锁
if (v == ObjectWaiter::TS_RUN) {
enter (Self) ;
}else{
ReenterI (Self, &node) ;
node.wait_reenter_end(this);
}
}
整体来说,这几段相当复杂,需要认真学习这里加锁的理论.
分享到:
相关推荐
现在,我们将深入探讨`Object`类中的所有方法。 1. **equals()**: 这个方法用于比较两个对象是否相等。默认的`equals()`方法仅仅比较对象的引用,即如果两个对象是同一个实例,那么它们相等。通常,你需要重写此...
Java中的`Object`类提供了`wait()`方法,这是Java多线程编程中一个至关重要的功能,它与`notify()`和`notifyAll()`一起用于线程间的协作。`wait()`方法主要用于实现线程的等待和唤醒机制,允许线程在特定条件下暂停...
Object类中的wait和notify方法是Java多线程编程中最重要的同步机制之一,它们是Java.lang.Object类中的两个方法,用于在多线程之间进行通信和同步。wait方法将当前线程置于等待状态,而notify方法则用于唤醒等待的...
Java 中Object的wait() notify() notifyAll()方法使用 在Java并发编程中,Object的wait()、notify()和notifyAll()方法是非常重要的概念,这三个方法都是Object类的方法,可以认为任意一个Object都是一种资源(或者...
Java中的`Object.wait()`、`Object.notify()`以及`Object.notifyAll()`是多线程编程中的核心方法,它们用于实现线程间的协作与通信。这些方法是`Object`类的最终原生(`final native`)方法,这意味着它们的实现位于...
wait() 方法是 Object 类里的方法,当一个线程执行到 wait() 方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout) 超时时间到后还需要返还对象锁)。...
在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object类的一个方法,用于让当前线程...
这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在深入探讨之前,我们先了解下`wait()`、`notify()`以及`notifyAll()`的基本概念。 ### `wait()` 方法 当一个线程执行到`wait()`方法时,它会...
在Java多线程编程中,`wait()`方法是线程同步的重要组成部分,它属于`java.lang.Object`类,主要用于在多线程环境下的资源协调。本文将深入探讨`wait()`方法的工作原理、使用场景以及注意事项。 `wait()`方法的主要...
在Java多线程编程中,`Thread.sleep()` 和 `Object.wait()` 是两个非常重要的方法,它们分别位于 `Thread` 类和 `Object` 类中,用于控制线程的行为。本文将深入探讨这两个方法的区别以及它们在实际开发中的应用场景...
`wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...
- `wait()` 方法是 `java.lang.Object` 类的一个实例方法,它只能在同步块或同步方法中使用,因为它涉及到对象锁的管理。当一个线程调用对象的 `wait()` 方法时,它会释放当前对象的锁,然后进入该对象的等待池,...
在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...
在Java编程语言中,`wait()`方法是Object类的一个成员,它被用于线程同步,特别是在多线程环境中实现线程间的通信。面试官提出这个问题的目的是了解面试者对Java并发编程的理解,以及他们在实践中如何有效地使用线程...
- 这些方法必须在同步上下文中调用,即在`synchronized`块或方法中。 - 调用`wait()`方法前必须获取监视器锁,否则会抛出`IllegalMonitorStateException`异常。 ##### 7. `finalize()` - **方法签名**:`...
Java中的`Object`类是所有类的根,这意味着无论你定义的任何自定义类,如果没有显式地声明继承自其他类,那么它们都会隐式地继承`Object`类。`Object`类提供了基本的方法,这些方法是所有Java对象共有的。下面我们将...
在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...
本案例代码将详细展示Object类的使用方法,并提供一些实际场景下的案例,以帮助开发者更好地理解和运用这些方法。 这份案例代码适合以下人群: Java初学者:如果你是刚开始学习Java编程,那么Object类是一个重要的...
- `toString()`方法是`Object`类中的一个关键方法,它的作用是返回对象的字符串表示。默认情况下,`toString()`方法返回的是类名加`@`后跟对象在内存中的哈希码的16进制表示。例如,`Person@3f99bd52`。 - 在实际...
`synchronized`关键字、`wait()`和`notify()`方法是Java多线程中用于控制并发访问共享资源的重要工具,它们是Java内存模型(JMM)的一部分,主要用于解决线程间的同步问题。 一、`synchronized`关键字 `...