`
xieyj
  • 浏览: 103054 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Object中notify方法

阅读更多

    Object.java类中notify调用的是share/vm/prims/jvm.cpp中的JVM_MonitorNotify。

    void JVM_MonitorNotify(JNIEnv* env, jobject handle)

    {

             Handle obj(THREAD, JNIHandles::resolve_non_null(handle));

             ObjectSynchronizer::notify(obj, CHECK);

    }

    看看ObjectSynchronizer::notify方法

    void ObjectSynchronizer::notify(Handle obj, TRAPS)

    {

             ObjectSynchronizer::inflate(THREAD, obj())->notify(THREAD);

    }

    上面的inflate获得一个ObjectMonitor,看看它的具体实现

    void ObjectMonitor::notify(TRAPS)

   {

             if (_WaitSet == NULL) { //没有等待的线程,直接返回
                    return ;
             }

             Thread::SpinAcquire (&_WaitSetLock, "WaitSet - notify") ; //进入同步区域

             ObjectWaiter * iterator = DequeueWaiter() ; //获得一个等待对象

             if (iterator != NULL) {

                   ObjectWaiter * List = _EntryList ; //唤醒队列

                   //将唤醒的任务加入队列

                   if (List == NULL) {
                            iterator->_next = iterator->_prev = NULL ;
                           _EntryList = iterator ;
                   } else {
                           iterator->TState = ObjectWaiter::TS_CXQ ;
                           for (;;) {
                                     ObjectWaiter * Front = _cxq ;
                                     iterator->_next = Front ;
                                     if (Atomic::cmpxchg_ptr (iterator, &_cxq, Front) == Front) {
                                              break ;
                                     }
                            }
                   }

             }

             iterator->wait_reenter_begin(this);

             Thread::SpinRelease (&_WaitSetLock) ; //离开同步区域

             ...........

    }

    在上面的代码中,只看到了将当前的线程加入唤醒队列的操作,但在wait方法中执行了park()操作,那是执行操作系统的等待方法。上面的步骤显然不能直接唤醒线程运行,那这线程是如何真正运行的呢?

    我们知道wait和notify操作是在一个同步块内执行的,如果不在同步块内,会报IllegalMonitorStateException(非法监视器状态违例),真正唤醒的动作是在离开同步块时候,也就是monitorexit操作。

    好,我们再看看monitorexit的执行代码,看看是否正确,看看InterpreterRuntime::monitorexit代码

    void InterpreterRuntime::monitorexit(JavaThread* thread, BasicObjectLock* elem)

    {

             Handle h_obj(thread, elem->obj());

             ObjectSynchronizer::slow_exit(h_obj(), elem->lock(), thread);

    }

    跟踪进去,调用的是

    void  ObjectMonitor::exit

    {

             ...........

             w = _EntryList  ;
              if (w != NULL) {
                       ExitEpilog (Self, w) ;
                       return ;
              }

    }

    void ObjectMonitor::ExitEpilog (Thread * Self, ObjectWaiter * Wakee) {

              ParkEvent * Trigger = Wakee->_event ;

              .............

              Trigger->unpark() ; //通过操作系统提供的方法,真正唤醒线程

    }

    在上面可以证实是在监视器退去时候真正唤醒线程,同时也就明白了wait和notify 必须在synchronized块里面调用的原因,再回顾上篇wait代码中,也就理解了wait方法内必须执行退出监视器的原因。

1
2
分享到:
评论

相关推荐

    Object类wait及notify方法原理实例解析

    Object类中的wait和notify方法是Java多线程编程中最重要的同步机制之一,它们是Java.lang.Object类中的两个方法,用于在多线程之间进行通信和同步。wait方法将当前线程置于等待状态,而notify方法则用于唤醒等待的...

    JAVA之Object类所有方法

    现在,我们将深入探讨`Object`类中的所有方法。 1. **equals()**: 这个方法用于比较两个对象是否相等。默认的`equals()`方法仅仅比较对象的引用,即如果两个对象是同一个实例,那么它们相等。通常,你需要重写此...

    Java 中Object的wait() notify() notifyAll()方法使用

    Java 中Object的wait() notify() notifyAll()方法使用 在Java并发编程中,Object的wait()、notify()和notifyAll()方法是非常重要的概念,这三个方法都是Object类的方法,可以认为任意一个Object都是一种资源(或者...

    java之wait,notify的用法([ 详解+实例 ])

    在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object类的一个方法,用于让当前线程...

    Object.wait()与Object.notify()的用法详细解析

    Java中的`Object.wait()`、`Object.notify()`以及`Object.notifyAll()`是多线程编程中的核心方法,它们用于实现线程间的协作与通信。这些方法是`Object`类的最终原生(`final native`)方法,这意味着它们的实现位于...

    java中几个notify、wait使用实例

    这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在深入探讨之前,我们先了解下`wait()`、`notify()`以及`notifyAll()`的基本概念。 ### `wait()` 方法 当一个线程执行到`wait()`方法时,它会...

    Java 同步方式 wait和notify/notifyall

    在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...

    wait_notify_demo

    `wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...

    Java多线程wait和notify

    在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...

    深入理解Wait、Notify和Wait与sleep区别

    首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。这些方法只能在同步环境中(如`synchronized`块或方法)使用,否则会抛出`IllegalMonitorStateException`。它们的...

    主线程去控制子线程wait与notify

    这两个方法是Java语言中的Object类提供的,因此所有的对象都可以使用。在本文中,我们将深入探讨如何使用主线程来控制子线程的`wait()`和`notify()`操作,以及它们在并发编程中的作用。 首先,`wait()`方法会导致...

    一个理解wait()与notify()的例子

    `notify()`也是`Object`类中的方法,用于唤醒正在等待此对象锁的一个线程。当一个线程调用`notify()`时,会随机选择一个正在等待该对象锁的线程使其恢复运行。 - **`notify();`**:在`ThreadB`的`synchronized`代码...

    src01 Object

    - 这些方法必须在同步上下文中调用,即在`synchronized`块或方法中。 - 调用`wait()`方法前必须获取监视器锁,否则会抛出`IllegalMonitorStateException`异常。 ##### 7. `finalize()` - **方法签名**:`...

    java中关键字Object详解

    Java中的`Object`类是所有类的根,这意味着无论你定义的任何自定义类,如果没有显式地声明继承自其他类,那么它们都会隐式地继承`Object`类。`Object`类提供了基本的方法,这些方法是所有Java对象共有的。下面我们将...

    JavaSE之Object与Object类

    - `toString()`方法是`Object`类中的一个关键方法,它的作用是返回对象的字符串表示。默认情况下,`toString()`方法返回的是类名加`@`后跟对象在内存中的哈希码的16进制表示。例如,`Person@3f99bd52`。 - 在实际...

    详解Java中Object 类的使用.rar

    6. **反射机制**:Object类中的`getClass()`方法返回一个`Class`对象,代表了运行时的类信息。配合Java的反射API,我们可以动态地获取类的属性、方法等信息,实现动态调用和类型检查。 7. **线程同步**:`wait()`、...

    Java多线程中wait、notify、notifyAll使用详解

    Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 一、wait()方法 wait()方法是使当前线程自动...

    java中的Object类[文].pdf

    `Object`类中的`registeNatives()`方法是`private static native`的,这意味着它只能在`Object`类内部被调用,且是一个本地方法,负责注册本地方法的实现。 总的来说,`Object`类提供了对象的基本操作和行为,而`...

    谈谈Object下有哪些方法?

    以下是Object类中的13个方法的详细说明: 1. **Object()**: 这是Object类的构造方法,没有任何参数。每个类的实例化过程都会隐式调用此构造方法。 2. **registerNatives()**: 这是一个内部使用的 native 方法,...

    java中object类实例分析

    在Java中,Object类还提供了其他一些方法,例如wait、notify、notifyAll等方法。这些方法都是线程相关的,用于线程之间的通信和同步。 在实际编程中,我们经常需要重写Object类中的方法,例如equals和hashCode方法...

Global site tag (gtag.js) - Google Analytics