从技术上讲,Java中的线程是否可以自行解锁?
我在一段时间的采访中被问到这个问题并回答说这是不可能的,但面试官告诉我这是.不幸的是,我无法获得如何实现这种僵局的方法.
这让我思考,我能想到的唯一情况就是你可以实现这一点的地方就是你有一个RMI服务器进程,其中包含一个调用自身的方法.调用该方法的代码行放在synchronized块中.
这甚至可能还是面试官不正确?
我正在考虑的源代码是这些行(其中testDeadlock在RMI服务器进程中运行)
public boolean testDeadlock () throws RemoteException {
synchronized (this) {
//Call testDeadlock via RMI loopback
}
}
Run Code Online (Sandbox Code Playgroud) 我AttachNotSupportedException
在linux(ubuntu 64bit)上运行jmockit测试时得到的.Java版本是1.7.0_51.这个JDK来自Oracle.使用ant运行测试(可能不相关)
查看堆栈跟踪.
[junit]
[junit] java.lang.RuntimeException: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
[junit] at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:89)
[junit] at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54)
[junit] at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21)
[junit] at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:136)
[junit] at mockit.internal.startup.Startup.initializeIfPossible(Startup.java:169)
[junit] at junit.framework.TestResult.<clinit>(TestResult.java:15)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:356)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1165)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:1016)
[junit] Caused by: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
[junit] at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
[junit] at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:79)
[junit] ... 8 more
[junit] Exception …
Run Code Online (Sandbox Code Playgroud) 我想杀死陷入死锁状态的线程.首先,我们可以使用类中的方法检测处于死锁状态的线程ID.findDeadlockedThreads()
ThreadMXBean
java.lang.management
于是,我想通过杀死线程ID线程,因此我有两个相关的问题:
(1)如何获得通过线程ID线程的控制?
(2)如何杀死被阻塞的线程?我认为调用interrupt()方法会给线程一个异常并将杀死线程.
我在Stack Overflow上找到了一个代码,我认为它与我所面临的非常相似但我仍然不明白为什么会进入死锁状态.该示例取自Java中的死锁检测:
Class A
{
synchronized void methodA(B b)
{
b.last();
}
synchronized void last()
{
System.out.println(“ Inside A.last()”);
}
}
Class B
{
synchronized void methodB(A a)
{
a.last();
}
synchronized void last()
{
System.out.println(“ Inside B.last()”);
}
}
Class Deadlock implements Runnable
{
A a = new A();
B b = new B();
// Constructor
Deadlock()
{
Thread t = new Thread(this);
t.start();
a.methodA(b);
}
public void run()
{
b.methodB(a);
}
public static void main(String args[] …
Run Code Online (Sandbox Code Playgroud) 我正在阅读java代码以确保它是线程安全的.
据我所知,方法中的任何局部变量都是线程安全的,因为它属于堆栈内存地址.任何类/实例变量都不是线程安全的,因为它属于堆内存,由其他线程共享.
根据经验,我可以在触及类变量的每个方法上放置一个synchronized关键字.
是否有任何eclipse插件,或者我可以分析/防止多线程问题的规则?
我有一个应用程序当前被卡住,我正在尝试了解原因。在kill -3(线程转储)输出中,我看到许多线程正在等待锁定对象(特别是等待Vector的同步方法),但我没有看到任何线程持有该锁。
知道如何调试吗?
谢谢
PS 我知道 Vector 很旧,更推荐使用 ArrayList,但这是我正在尝试调试的遗留代码。
有人能告诉我如何在Java多线程应用程序中找到"有多少线程处于死锁状态"?找出死锁线程列表的方法是什么?
我听说过Thread Dump和Stack Traces,但我不知道如何实现它.
请告诉我您的意见和建议.