possible bug with synchronized methods
Godmar Back
gback@cs.utah.edu
Tue Nov 16 14:38:00 GMT 1999
I am trying to figure out how gcj exits the monitors associated with
synchronized methods when an exception occurs.
The following test case fails for a gcj/libgcj configured with
--enable-threads=posix. I've filed a bug report, feel free to include
the program in the test suite if you think it would be useful.
>From looking at the code, I don't quite understand why this program
fails. In decl.c, the method body is wrapped in a mon_enter with
a mon_exit as a "cleanup" clause. In stmt.c, a comment above
expand_decl_cleanup says that the cleanup cause is invoked in the
case of exceptions. So it should work, should it not?
Does anybody know what's going on?
- Godmar
/**
* Test that locks taken in synchronized methods are properly unlocked
* when an exception occurs. Note that different mechanisms are used in
* compiler & interpreter.
*
* @author Godmar Back <gback@cs.utah.edu>
*/
public class TestUnlock {
synchronized void throwException() throws Exception {
throw new Exception();
}
synchronized void success() {
System.out.println("Success.");
}
public static void main(String av[]) throws Exception {
final TestUnlock me = new TestUnlock();
new Thread() {
public void run() {
try {
Thread.sleep(2000);
} catch (Exception _) { }
System.out.println("Time out. Failure.");
System.exit(-1);
}
}.start();
Thread t = new Thread() {
public void run() {
try {
me.throwException();
} catch (Exception _) {
}
}
};
t.start();
t.join();
Thread t2 = new Thread() {
public void run() {
me.success();
}
};
t2.start();
t2.join();
System.exit(0);
}
}
/* Expected Output:
Success.
*/
More information about the Java
mailing list