[Spread-users] remove/disconnect appears to deadlock in Java (4.0.0RC2)

Doug Palmer Doug.Palmer at csiro.au
Tue Aug 15 02:17:12 EDT 2006


When attempting to shut down a SpreadConnection in Java I seem to be
running into trouble with

this.connection.remove(this);
this.connection.disconnect();

If I do this, then the disconnect often locks up. Instead, I have to
write something like

this.connection.remove(this);
Thread.sleep(2000); // Give it a chance to shut down
this.connection.disconnect();

Looking at a deadlock dump from the JVM, I see

[java] "AWT-EventQueue-0" prio=1 tid=0x09b4fb90 nid=0x7319 waiting for
monitor entry [0xb117d000..0xb117e1c0]
[java]     at
spread.SpreadConnection.disconnect(SpreadConnection.java:927)
[java]     - waiting to lock <0x88f74f28> (a spread.SpreadConnection)
[java]     at
org.csiro.fargnosticon.control.SpreadMessageTransport.disconnnect
....


[java] "Thread-4" daemon prio=1 tid=0x09a212a8 nid=0x7315 in
Object.wait() [0xb155a000..0xb155afc0]
[java]     at java.lang.Object.wait(Native Method)
[java]     - waiting on <0x88f77200> (a spread.SpreadConnection
$Listener)
[java]     at java.lang.Thread.join(Thread.java:1095)
[java]     - locked <0x88f77200> (a spread.SpreadConnection$Listener)
[java]     at java.lang.Thread.join(Thread.java:1148)
[java]     at
spread.SpreadConnection.stopListener(SpreadConnection.java:1482)
[java]     at spread.SpreadConnection.remove(SpreadConnection.java:1532)
[java]     - locked <0x88f76010> (a java.lang.Boolean)
[java]     at spread.SpreadConnection
$Listener.run(SpreadConnection.java:1783)
[java]     - locked <0x88f74f28> (a spread.SpreadConnection)

and

[java] "Thread-0" daemon prio=1 tid=0x09a06b08 nid=0x7311 runnable
[0xb175e000..0xb175f1c0]
[java]     at java.net.SocketInputStream.socketRead0(Native Method)
[java]     at
java.net.SocketInputStream.read(SocketInputStream.java:129)
[java]     at
spread.SpreadConnection.internal_receive(SpreadConnection.java:1049)
[java]     at spread.SpreadConnection.access
$200(SpreadConnection.java:69)
[java]     at spread.SpreadConnection
$Listener.run(SpreadConnection.java:1672)
[java]     - locked <0x88f5fd28> (a java.lang.Boolean)
[java]     - locked <0x88f5ca28> (a spread.SpreadConnection)

So it would appear that the disconnect process deadlocks with two
threads trying to get a lock on the SpreadConnection object.

It would seem to me that part of the problem is that socket reads from a
stream block and you want to interrupt the read. The java.nio.* classes
allow non-blocking reads and writes. Is there some reason why spread
doesn't use java.nio?









More information about the Spread-users mailing list