JVM仅跟踪具有监视器的本地线程,如果调用类对其自身进行外部调用,则传入调用将导致原始线程自身死锁。
您应该能够运行此代码来说明这个想法
import java.rmi.*;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;import java.rmi.server.*;public class DeadlockThreadExample { public static interface DeadlockClass extends Remote { public void execute() throws RemoteException; } public static class DeadlockClassImpl extends UnicastRemoteObject implements DeadlockClass { private Object lock = new Object(); public DeadlockClassImpl() throws RemoteException { super(); } public void execute() throws RemoteException { try { System.out.println("execute()::start"); synchronized (lock) { System.out.println("execute()::Entered Lock"); DeadlockClass deadlockClass = (DeadlockClass) Naming.lookup("rmi://localhost/DeadlockClass"); deadlockClass.execute(); } System.out.println("execute()::Exited Lock"); } catch (NotBoundException e) { System.out.println(e.getMessage()); } catch (java.net.MalformedURLException e) { System.out.println(e.getMessage()); } System.out.println("execute()::end"); } } public static void main(String[] args) throws Exception { LocateRegistry.createRegistry(Registry.REGISTRY_PORT); DeadlockClassImpl deadlockClassImpl = new DeadlockClassImpl(); Naming.rebind("DeadlockClass", deadlockClassImpl); DeadlockClass deadlockClass = (DeadlockClass) Naming.lookup("rmi://localhost/DeadlockClass"); deadlockClass.execute(); System.exit(0); }}程序的输出看起来像
execute()::startexecute()::Entered Lockexecute()::start
此外,该线程还转储显示以下内容
"main" prio=6 tid=0x00037fb8 nid=0xb80 runnable [0x0007f000..0x0007fc3c] at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read(BufferedInputStream.java:235) - locked <0x02fdc568> (a java.io.BufferedInputStream) at java.io.DataInputStream.readByte(DataInputStream.java:241)"RMI TCP Connection(4)-172.17.23.165" daemon prio=6 tid=0x0ad83d30 nid=0x1590 waiting for monitor entry [0x0b3cf000..0x0b3cfce8] at DeadlockThreadExample$DeadlockClassImpl.execute(DeadlockThreadExample.java:24) - waiting to lock <0x0300a848> (a java.lang.Object) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)"RMI TCP Connection(2)-172.17.23.165" daemon prio=6 tid=0x0ad74008 nid=0x15f0 runnable [0x0b24f000..0x0b24fbe8] at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read(BufferedInputStream.java:235) - locked <0x02ffb6d8> (a java.io.BufferedInputStream) at java.io.DataInputStream.readByte(DataInputStream.java:241)
这表明线程确实已经成功锁定了自己



