-
Bug
-
Resolution: Duplicate
-
P4
-
None
-
1.3.0
-
sparc
-
solaris_7
Name: dkC59003 Date: 09/01/99
The classic VM (J2SDK 1.3beta) does not throw an IllegalMonitorStateException
when athrow instruction is executed in a synchronized method
and the current thread is not the owner of the monitor.
The athrow instruction specification (The JVM Specification (2nd edition),
chapter 6, page 187) says:
"...
Otherwise, if the method of the current frame is a synchronized method and the
current thread is not the owner of the monitor acquired or reentered on
invocation of the method, athrow throws an IllegalMonitorStateException instead of
the object previously being thrown. This can happen, for example, if an abruptly
completing synchronized method contains a monitorexit instruction, but no
monitorenter instruction, on the object on which the method is synchronized.
..."
If the JVM corresponds to the considered assertion, then the test (below)
must return the integer value 0 (expected result - STATUS_PASSED).
Otherwise, the test must return the integer value 2
(unexpected result - STATUS_FAILED).
The execution of this test under HotSpot Client VM mode produces 0 as
result, ie the test is PASSED. In this case athrow instruction correctly
throws an IllegalMonitorStateException.
But the execution of this test under Classic VM mode produces 2 as
result, ie the test is FAILED. In this case athrow instruction throws
ArithmeticException instead of IllegalMonitorStateException.
See logs and source below.
For HotSpot Client VM mode:
% java -version
java version "1.3beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3beta-O)
Java(TM) HotSpot Client VM (build 1.3beta-O-release, 1.3beta-O-release, interpreted mode)
% java athrow013011
% echo $status
0
For Classic VM mode:
% java -green -version
java version "1.3beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3beta-O)
Classic VM (build 1.3beta-O, green threads, nojit)
novo73% java -green athrow013011
novo73% echo $status
2
or
% java -native -version
java version "1.3beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3beta-O)
Classic VM (build 1.3beta-O, native threads, nojit)
% java -native athrow013011
% echo $status
2
NOTES
Under JVM 1.1.8 the test produces unexpected result too but
this result differs from one under Classic VM (J2SDK 1.3beta):
% java -version
java version "1.1.8"
% java athrow013011
java.lang.NoClassDefFoundError
% echo $status
1
------------------------------ source text of test -----------------------
public class athrow013011
extends java/lang/Object
{
static Field test_result:"I";
public static Method main:"([Ljava/lang/String;)V"
stack 2 locals 1
{
aload_0;
getstatic Field java/lang/System.out:"Ljava/io/PrintStream;";
invokestatic Method run:"([Ljava/lang/String;Ljava/io/PrintStream;)I";
// on stack - test_result
invokestatic Method java/lang/System.exit:"(I)V";
return;
}
public static Method run:"([Ljava/lang/String;Ljava/io/PrintStream;)I"
stack 2 locals 2
{
iconst_0/*STATUS_PASSED*/;
putstatic Field test_result:"I";
new class athrow013011;
dup;
invokespecial Method <init>:"()V";
// on stack - athrow013011 object
try TRY0; // for IllegalMonitorStateException
try TRY1; // for ArithmeticException
invokevirtual Method test_body:"()V";
iconst_2/*STATUS_FAILED*/;
ireturn;
endtry TRY1;
catch TRY1 java/lang/ArithmeticException;
pop;
iconst_2/*STATUS_FAILED*/;
ireturn;
endtry TRY0;
catch TRY0 java/lang/IllegalMonitorStateException;
pop;
getstatic Field test_result:"I";
ireturn;
}
synchronized Method test_body:"()V"
stack 2 locals 1
{
aload_0;
monitorexit; // monitor is freed
new class java/lang/ArithmeticException;
dup;
invokenonvirtual Method java/lang/ArithmeticException.<init>:"()V";
athrow; // must throw java/lang/IllegalMonitorStateException
// if no any exception will be thrown
iconst_2/*STATUS_FAILED*/;
putstatic Field test_result:"I";
return; // must throw java/lang/IllegalMonitorStateException
}
public Method <init>:"()V"
stack 1 locals 1
{
aload_0;
invokespecial Method java/lang/Object.<init>:"()V";
return;
}
} // end Class athrow013011
-------------------------------------- end of text of test -----------------------
==========================================================
======================================================================
- duplicates
-
JDK-4259918 return instruction of a synchronized method does not throw Exception if the curr
- Closed