1 /*
  2  * Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  */
 23 
 24 package java.lang;
 25 
 26 import jdk.internal.misc.Blocker;
 27 import nsk.jvmti.scenarios.bcinstr.BI04.bi04t002a;
 28 
 29 /**
 30  * Class <code>Object</code> is the root of the class hierarchy.
 31  * Every class has <code>Object</code> as a superclass. All objects,
 32  * including arrays, implement the methods of this class.
 33  *
 34  * @author  unascribed
 35  * @version 1.67, 02/03/04
 36  * @see     java.lang.Class
 37  * @since   JDK1.0
 38  */
 39 public class Object {
 40 
 41     /**
 42      * Returns the runtime class of an object. That <tt>Class</tt>
 43      * object is the object that is locked by <tt>static synchronized</tt>
 44      * methods of the represented class.











 45      *
 46      * @return The <code>java.lang.Class</code> object that represents
 47      *         the runtime class of the object.  The result is of type
 48      *         {@code Class<? extends X>} where X is the
 49      *         static type of the expression on which
 50      *         <code>getClass</code> is called.



 51      */
 52     public final native Class<? extends Object> getClass();

 53 
 54     /**
 55      * Returns a hash code value for the object. This method is
 56      * supported for the benefit of hashtables such as those provided by
 57      * <code>java.util.Hashtable</code>.
 58      * <p>
 59      * The general contract of <code>hashCode</code> is:
 60      * <ul>
 61      * <li>Whenever it is invoked on the same object more than once during
 62      *     an execution of a Java application, the <tt>hashCode</tt> method
 63      *     must consistently return the same integer, provided no information
 64      *     used in <tt>equals</tt> comparisons on the object is modified.
 65      *     This integer need not remain consistent from one execution of an
 66      *     application to another execution of the same application.
 67      * <li>If two objects are equal according to the <tt>equals(Object)</tt>
 68      *     method, then calling the <code>hashCode</code> method on each of
 69      *     the two objects must produce the same integer result.

 70      * <li>It is <em>not</em> required that if two objects are unequal
 71      *     according to the {@link java.lang.Object#equals(java.lang.Object)}
 72      *     method, then calling the <tt>hashCode</tt> method on each of the
 73      *     two objects must produce distinct integer results.  However, the
 74      *     programmer should be aware that producing distinct integer results
 75      *     for unequal objects may improve the performance of hashtables.
 76      * </ul>
 77      * <p>
 78      * As much as is reasonably practical, the hashCode method defined by
 79      * class <tt>Object</tt> does return distinct integers for distinct
 80      * objects. (This is typically implemented by converting the internal
 81      * address of the object into an integer, but this implementation
 82      * technique is not required by the
 83      * Java<font size="-2"><sup>TM</sup></font> programming language.)
 84      *
 85      * @return  a hash code value for this object.








 86      * @see     java.lang.Object#equals(java.lang.Object)
 87      * @see     java.util.Hashtable
 88      */

 89     public native int hashCode();
 90 
 91     /**
 92      * Indicates whether some other object is "equal to" this one.
 93      * <p>
 94      * The <code>equals</code> method implements an equivalence relation
 95      * on non-null object references:
 96      * <ul>
 97      * <li>It is <i>reflexive</i>: for any non-null reference value
 98      *     <code>x</code>, <code>x.equals(x)</code> should return
 99      *     <code>true</code>.
100      * <li>It is <i>symmetric</i>: for any non-null reference values
101      *     <code>x</code> and <code>y</code>, <code>x.equals(y)</code>
102      *     should return <code>true</code> if and only if
103      *     <code>y.equals(x)</code> returns <code>true</code>.
104      * <li>It is <i>transitive</i>: for any non-null reference values
105      *     <code>x</code>, <code>y</code>, and <code>z</code>, if
106      *     <code>x.equals(y)</code> returns <code>true</code> and
107      *     <code>y.equals(z)</code> returns <code>true</code>, then
108      *     <code>x.equals(z)</code> should return <code>true</code>.
109      * <li>It is <i>consistent</i>: for any non-null reference values
110      *     <code>x</code> and <code>y</code>, multiple invocations of
111      *     <tt>x.equals(y)</tt> consistently return <code>true</code>
112      *     or consistently return <code>false</code>, provided no
113      *     information used in <code>equals</code> comparisons on the
114      *     objects is modified.
115      * <li>For any non-null reference value <code>x</code>,
116      *     <code>x.equals(null)</code> should return <code>false</code>.
117      * </ul>

118      * <p>
119      * The <tt>equals</tt> method for class <code>Object</code> implements







120      * the most discriminating possible equivalence relation on objects;
121      * that is, for any non-null reference values <code>x</code> and
122      * <code>y</code>, this method returns <code>true</code> if and only
123      * if <code>x</code> and <code>y</code> refer to the same object
124      * (<code>x == y</code> has the value <code>true</code>).
125      * <p>
126      * Note that it is generally necessary to override the <tt>hashCode</tt>




127      * method whenever this method is overridden, so as to maintain the
128      * general contract for the <tt>hashCode</tt> method, which states
129      * that equal objects must have equal hash codes.



130      *
131      * @param   obj   the reference object with which to compare.
132      * @return  <code>true</code> if this object is the same as the obj
133      *          argument; <code>false</code> otherwise.
134      * @see     #hashCode()
135      * @see     java.util.Hashtable
136      */
137     public boolean equals(Object obj) {
138         bi04t002a.instrInvoke(bi04t002a.INSTR_EQUALS);
139         return (this == obj);
140     }
141 
142     /**
143      * Creates and returns a copy of this object.  The precise meaning
144      * of "copy" may depend on the class of the object. The general
145      * intent is that, for any object <tt>x</tt>, the expression:
146      * <blockquote>
147      * <pre>
148      * x.clone() != x</pre></blockquote>
149      * will be true, and that the expression:
150      * <blockquote>
151      * <pre>
152      * x.clone().getClass() == x.getClass()</pre></blockquote>
153      * will be <tt>true</tt>, but these are not absolute requirements.
154      * While it is typically the case that:
155      * <blockquote>
156      * <pre>
157      * x.clone().equals(x)</pre></blockquote>
158      * will be <tt>true</tt>, this is not an absolute requirement.
159      * <p>
160      * By convention, the returned object should be obtained by calling
161      * <tt>super.clone</tt>.  If a class and all of its superclasses (except
162      * <tt>Object</tt>) obey this convention, it will be the case that
163      * <tt>x.clone().getClass() == x.getClass()</tt>.
164      * <p>
165      * By convention, the object returned by this method should be independent
166      * of this object (which is being cloned).  To achieve this independence,
167      * it may be necessary to modify one or more fields of the object returned
168      * by <tt>super.clone</tt> before returning it.  Typically, this means
169      * copying any mutable objects that comprise the internal "deep structure"
170      * of the object being cloned and replacing the references to these
171      * objects with references to the copies.  If a class contains only
172      * primitive fields or references to immutable objects, then it is usually
173      * the case that no fields in the object returned by <tt>super.clone</tt>
174      * need to be modified.
175      * <p>
176      * The method <tt>clone</tt> for class <tt>Object</tt> performs a

177      * specific cloning operation. First, if the class of this object does
178      * not implement the interface <tt>Cloneable</tt>, then a
179      * <tt>CloneNotSupportedException</tt> is thrown. Note that all arrays
180      * are considered to implement the interface <tt>Cloneable</tt>.


181      * Otherwise, this method creates a new instance of the class of this
182      * object and initializes all its fields with exactly the contents of
183      * the corresponding fields of this object, as if by assignment; the
184      * contents of the fields are not themselves cloned. Thus, this method
185      * performs a "shallow copy" of this object, not a "deep copy" operation.
186      * <p>
187      * The class <tt>Object</tt> does not itself implement the interface
188      * <tt>Cloneable</tt>, so calling the <tt>clone</tt> method on an object
189      * whose class is <tt>Object</tt> will result in throwing an
190      * exception at run time.
191      *
192      * @return     a clone of this instance.
193      * @exception  CloneNotSupportedException  if the object's class does not
194      *               support the <code>Cloneable</code> interface. Subclasses
195      *               that override the <code>clone</code> method can also
196      *               throw this exception to indicate that an instance cannot
197      *               be cloned.
198      * @see java.lang.Cloneable
199      */

200     protected native Object clone() throws CloneNotSupportedException;
201 
202     /**
203      * Returns a string representation of the object. In general, the
204      * <code>toString</code> method returns a string that






205      * "textually represents" this object. The result should
206      * be a concise but informative representation that is easy for a
207      * person to read.
208      * It is recommended that all subclasses override this method.
209      * <p>
210      * The <code>toString</code> method for class <code>Object</code>


211      * returns a string consisting of the name of the class of which the
212      * object is an instance, the at-sign character `<code>@</code>', and
213      * the unsigned hexadecimal representation of the hash code of the
214      * object. In other words, this method returns a string equal to the
215      * value of:
216      * <blockquote>
217      * <pre>
218      * getClass().getName() + '@' + Integer.toHexString(hashCode())
219      * </pre></blockquote>
220      *
221      * @return  a string representation of the object.



222      */
223     public String toString() {
224         bi04t002a.instrInvoke(bi04t002a.INSTR_TOSTRING);
225         return getClass().getName() + "@" + Integer.toHexString(hashCode());
226     }
227 
228     /**
229      * Wakes up a single thread that is waiting on this object's
230      * monitor. If any threads are waiting on this object, one of them
231      * is chosen to be awakened. The choice is arbitrary and occurs at
232      * the discretion of the implementation. A thread waits on an object's
233      * monitor by calling one of the <code>wait</code> methods.
234      * <p>
235      * The awakened thread will not be able to proceed until the current
236      * thread relinquishes the lock on this object. The awakened thread will
237      * compete in the usual manner with any other threads that might be
238      * actively competing to synchronize on this object; for example, the
239      * awakened thread enjoys no reliable privilege or disadvantage in being
240      * the next thread to lock this object.
241      * <p>
242      * This method should only be called by a thread that is the owner
243      * of this object's monitor. A thread becomes the owner of the
244      * object's monitor in one of three ways:
245      * <ul>
246      * <li>By executing a synchronized instance method of that object.
247      * <li>By executing the body of a <code>synchronized</code> statement
248      *     that synchronizes on the object.
249      * <li>For objects of type <code>Class,</code> by executing a
250      *     synchronized static method of that class.
251      * </ul>
252      * <p>
253      * Only one thread at a time can own an object's monitor.
254      *
255      * @exception  IllegalMonitorStateException  if the current thread is not
256      *               the owner of this object's monitor.
257      * @see        java.lang.Object#notifyAll()
258      * @see        java.lang.Object#wait()
259      */

260     public final native void notify();
261 
262     /**
263      * Wakes up all threads that are waiting on this object's monitor. A
264      * thread waits on an object's monitor by calling one of the
265      * <code>wait</code> methods.
266      * <p>
267      * The awakened threads will not be able to proceed until the current
268      * thread relinquishes the lock on this object. The awakened threads
269      * will compete in the usual manner with any other threads that might
270      * be actively competing to synchronize on this object; for example,
271      * the awakened threads enjoy no reliable privilege or disadvantage in
272      * being the next thread to lock this object.
273      * <p>
274      * This method should only be called by a thread that is the owner
275      * of this object's monitor. See the <code>notify</code> method for a
276      * description of the ways in which a thread can become the owner of
277      * a monitor.
278      *
279      * @exception  IllegalMonitorStateException  if the current thread is not
280      *               the owner of this object's monitor.
281      * @see        java.lang.Object#notify()
282      * @see        java.lang.Object#wait()
283      */

284     public final native void notifyAll();
285 
286     /**
287      * Causes current thread to wait until either another thread invokes the
288      * {@link java.lang.Object#notify()} method or the
289      * {@link java.lang.Object#notifyAll()} method for this object, or a
290      * specified amount of time has elapsed.
291      * <p>
292      * The current thread must own this object's monitor.
293      * <p>
294      * This method causes the current thread (call it <var>T</var>) to
295      * place itself in the wait set for this object and then to relinquish
296      * any and all synchronization claims on this object. Thread <var>T</var>
297      * becomes disabled for thread scheduling purposes and lies dormant
298      * until one of four things happens:
299      * <ul>
300      * <li>Some other thread invokes the <tt>notify</tt> method for this
301      * object and thread <var>T</var> happens to be arbitrarily chosen as
302      * the thread to be awakened.
303      * <li>Some other thread invokes the <tt>notifyAll</tt> method for this
304      * object.
305      * <li>Some other thread {@link java.lang.Thread#interrupt() interrupts}
306      * thread <var>T</var>.
307      * <li>The specified amount of real time has elapsed, more or less.  If
308      * <tt>timeout</tt> is zero, however, then real time is not taken into
309      * consideration and the thread simply waits until notified.
310      * </ul>
311      * The thread <var>T</var> is then removed from the wait set for this
312      * object and re-enabled for thread scheduling. It then competes in the
313      * usual manner with other threads for the right to synchronize on the
314      * object; once it has gained control of the object, all its
315      * synchronization claims on the object are restored to the status quo
316      * ante - that is, to the situation as of the time that the <tt>wait</tt>
317      * method was invoked. Thread <var>T</var> then returns from the
318      * invocation of the <tt>wait</tt> method. Thus, on return from the
319      * <tt>wait</tt> method, the synchronization state of the object and of
320      * thread <tt>T</tt> is exactly as it was when the <tt>wait</tt> method
321      * was invoked.
322      * <p>
323      * A thread can also wake up without being notified, interrupted, or
324      * timing out, a so-called <i>spurious wakeup</i>.  While this will rarely
325      * occur in practice, applications must guard against it by testing for
326      * the condition that should have caused the thread to be awakened, and
327      * continuing to wait if the condition is not satisfied.  In other words,
328      * waits should always occur in loops, like this one:
329      * <pre>
330      *     synchronized (obj) {
331      *         while (&lt;condition does not hold&gt;)
332      *             obj.wait(timeout);
333      *         ... // Perform action appropriate to condition
334      *     }
335      * </pre>
336      * (For more information on this topic, see Section 3.2.3 in Doug Lea's
337      * "Concurrent Programming in Java (Second Edition)" (Addison-Wesley,
338      * 2000), or Item 50 in Joshua Bloch's "Effective Java Programming
339      * Language Guide" (Addison-Wesley, 2001).
340      * <p>
341      * If the current thread is
342      * {@link java.lang.Thread#interrupt() interrupted} by another thread
343      * while it is waiting, then an <tt>InterruptedException</tt> is thrown.
344      * This exception is not thrown until the lock status of this object has
345      * been restored as described above.
346      * <p>
347      * Note that the <tt>wait</tt> method, as it places the current thread
348      * into the wait set for this object, unlocks only this object; any
349      * other objects on which the current thread may be synchronized remain
350      * locked while the thread waits.
351      * <p>
352      * This method should only be called by a thread that is the owner
353      * of this object's monitor. See the <code>notify</code> method for a
354      * description of the ways in which a thread can become the owner of
355      * a monitor.
356      *
357      * @param      timeout   the maximum time to wait in milliseconds.
358      * @exception  IllegalArgumentException      if the value of timeout is
359      *               negative.
360      * @exception  IllegalMonitorStateException  if the current thread is not
361      *               the owner of the object's monitor.
362      * @exception  InterruptedException if another thread interrupted the
363      *             current thread before or while the current thread
364      *             was waiting for a notification.  The <i>interrupted
365      *             status</i> of the current thread is cleared when
366      *             this exception is thrown.
367      * @see        java.lang.Object#notify()
368      * @see        java.lang.Object#notifyAll()
369      */
370     public final void wait(long timeoutMillis) throws InterruptedException {
371         if (!Thread.currentThread().isVirtual()) {
372             wait0(timeoutMillis);
373             return;
374         }
375 
376         // virtual thread waiting
377         boolean attempted = Blocker.begin();
378         try {






379             wait0(timeoutMillis);
380         } catch (InterruptedException e) {
381             // virtual thread's interrupt status needs to be cleared
382             Thread.currentThread().getAndClearInterrupt();
383             throw e;
384         } finally {
385             Blocker.end(attempted);
386         }
387     }
388 



389     /**
390      * Causes current thread to wait until another thread invokes the
391      * {@link java.lang.Object#notify()} method or the
392      * {@link java.lang.Object#notifyAll()} method for this object, or
393      * some other thread interrupts the current thread, or a certain
394      * amount of real time has elapsed.
395      * <p>
396      * This method is similar to the <code>wait</code> method of one
397      * argument, but it allows finer control over the amount of time to
398      * wait for a notification before giving up. The amount of real time,
399      * measured in nanoseconds, is given by:
400      * <blockquote>
401      * <pre>
402      * 1000000*timeout+nanos</pre></blockquote>
403      * <p>
404      * In all other respects, this method does the same thing as the
405      * method {@link #wait(long)} of one argument. In particular,
406      * <tt>wait(0, 0)</tt> means the same thing as <tt>wait(0)</tt>.
407      * <p>
408      * The current thread must own this object's monitor. The thread
409      * releases ownership of this monitor and waits until either of the
410      * following two conditions has occurred:
411      * <ul>
412      * <li>Another thread notifies threads waiting on this object's monitor
413      *     to wake up either through a call to the <code>notify</code> method
414      *     or the <code>notifyAll</code> method.
415      * <li>The timeout period, specified by <code>timeout</code>
416      *     milliseconds plus <code>nanos</code> nanoseconds arguments, has
417      *     elapsed.







418      * </ul>
419      * <p>
420      * The thread then waits until it can re-obtain ownership of the
421      * monitor and resumes execution.









422      * <p>
423      * As in the one argument version, interrupts and spurious wakeups are
424      * possible, and this method should always be used in a loop:
425      * <pre>






















426      *     synchronized (obj) {
427      *         while (&lt;condition does not hold&gt;)
428      *             obj.wait(timeout, nanos);
429      *         ... // Perform action appropriate to condition



430      *     }
431      * </pre>
432      * This method should only be called by a thread that is the owner
433      * of this object's monitor. See the <code>notify</code> method for a
434      * description of the ways in which a thread can become the owner of
435      * a monitor.
436      *
437      * @param      timeout   the maximum time to wait in milliseconds.
438      * @param      nanos      additional time, in nanoseconds range
439      *                       0-999999.
440      * @exception  IllegalArgumentException      if the value of timeout is
441      *                      negative or the value of nanos is
442      *                      not in the range 0-999999.
443      * @exception  IllegalMonitorStateException  if the current thread is not
444      *               the owner of this object's monitor.
445      * @exception  InterruptedException if another thread interrupted the
446      *             current thread before or while the current thread
447      *             was waiting for a notification.  The <i>interrupted
448      *             status</i> of the current thread is cleared when
449      *             this exception is thrown.
450      */
451     public final void wait(long timeout, int nanos) throws InterruptedException {
452 
453         bi04t002a.instrInvoke(bi04t002a.INSTR_WAIT_JI);
454 
455         if (timeout < 0) {
456             throw new IllegalArgumentException("timeout value is negative");
457         }
458 
459         if (nanos < 0 || nanos > 999999) {
460             throw new IllegalArgumentException(
461                                 "nanosecond timeout value out of range");
462         }
463 
464             if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
465                 timeout++;
466             }
467 
468             wait(timeout);
469     }
470 
471     // final modifier so method not in vtable
472     private final native void wait0(long timeoutMillis) throws InterruptedException;
473 
474     /**
475      * Causes current thread to wait until another thread invokes the
476      * {@link java.lang.Object#notify()} method or the
477      * {@link java.lang.Object#notifyAll()} method for this object.
478      * In other words, this method behaves exactly as if it simply
479      * performs the call <tt>wait(0)</tt>.
480      * <p>
481      * The current thread must own this object's monitor. The thread
482      * releases ownership of this monitor and waits until another thread
483      * notifies threads waiting on this object's monitor to wake up
484      * either through a call to the <code>notify</code> method or the
485      * <code>notifyAll</code> method. The thread then waits until it can
486      * re-obtain ownership of the monitor and resumes execution.
487      * <p>
488      * As in the one argument version, interrupts and spurious wakeups are
489      * possible, and this method should always be used in a loop:
490      * <pre>
491      *     synchronized (obj) {
492      *         while (&lt;condition does not hold&gt;)
493      *             obj.wait();
494      *         ... // Perform action appropriate to condition
495      *     }
496      * </pre>
497      * This method should only be called by a thread that is the owner
498      * of this object's monitor. See the <code>notify</code> method for a
499      * description of the ways in which a thread can become the owner of
500      * a monitor.
501      *
502      * @exception  IllegalMonitorStateException  if the current thread is not
503      *               the owner of the object's monitor.
504      * @exception  InterruptedException if another thread interrupted the
505      *             current thread before or while the current thread
506      *             was waiting for a notification.  The <i>interrupted
507      *             status</i> of the current thread is cleared when
508      *             this exception is thrown.
509      * @see        java.lang.Object#notify()
510      * @see        java.lang.Object#notifyAll()
511      */
512     public final void wait() throws InterruptedException {
513         bi04t002a.instrInvoke(bi04t002a.INSTR_WAIT);
514         wait(0);
515     }
516 
517     /**
518      * Called by the garbage collector on an object when garbage collection
519      * determines that there are no more references to the object.
520      * A subclass overrides the <code>finalize</code> method to dispose of
521      * system resources or to perform other cleanup.
522      * <p>
523      * The general contract of <tt>finalize</tt> is that it is invoked
524      * if and when the Java<font size="-2"><sup>TM</sup></font> virtual






525      * machine has determined that there is no longer any
526      * means by which this object can be accessed by any thread that has
527      * not yet died, except as a result of an action taken by the
528      * finalization of some other object or class which is ready to be
529      * finalized. The <tt>finalize</tt> method may take any action, including
530      * making this object available again to other threads; the usual purpose
531      * of <tt>finalize</tt>, however, is to perform cleanup actions before
532      * the object is irrevocably discarded. For example, the finalize method
533      * for an object that represents an input/output connection might perform
534      * explicit I/O transactions to break the connection before the object is
535      * permanently discarded.
536      * <p>
537      * The <tt>finalize</tt> method of class <tt>Object</tt> performs no
538      * special action; it simply returns normally. Subclasses of
539      * <tt>Object</tt> may override this definition.
540      * <p>
541      * The Java programming language does not guarantee which thread will
542      * invoke the <tt>finalize</tt> method for any given object. It is
543      * guaranteed, however, that the thread that invokes finalize will not
544      * be holding any user-visible synchronization locks when finalize is
545      * invoked. If an uncaught exception is thrown by the finalize method,
546      * the exception is ignored and finalization of that object terminates.
547      * <p>
548      * After the <tt>finalize</tt> method has been invoked for an object, no
549      * further action is taken until the Java virtual machine has again
550      * determined that there is no longer any means by which this object can
551      * be accessed by any thread that has not yet died, including possible
552      * actions by other objects or classes which are ready to be finalized,
553      * at which point the object may be discarded.
554      * <p>
555      * The <tt>finalize</tt> method is never invoked more than once by a Java
556      * virtual machine for any given object.
557      * <p>
558      * Any exception thrown by the <code>finalize</code> method causes
559      * the finalization of this object to be halted, but is otherwise
560      * ignored.
561      *
562      * @throws Throwable the <code>Exception</code> raised by this method
















































563      */

564     protected void finalize() throws Throwable { }
565 
566 }
--- EOF ---