4、我用的 IDEA 启动了一个程序
5、JVisualVM 的详细信息会出现在详细面板上
6、可以看具体的线程快照信息
右键,保存线程快照信息。
收集线程快照信息主要是为了监控是否有出现死锁的情况:
刚好我这里有个例子:
package com.concurrent.deadLock;
/**
-
@author riemann
-
@date 2019/08/14 22:44
*/
public class ThreadTest {
public static void main(String[] args) {
new Thread(new Thread1()).start();
new Thread(new Thread2()).start();
// new Thread(new Thread3()).start();
}
}
class ThreadResource {
public static Object resource1 = new Object();
public static Object resource2 = new Object();
}
class Thread1 implements Runnable {
@Override
public void run() {
try {
System.out.println(“Thread1 is running”);
synchronized (ThreadResource.resource1) {
System.out.println(“Thread1 lock resource1”);
Thread.sleep(2000);//休眠2s等待线程2锁定资源2
synchronized (ThreadResource.resource2) {
System.out.println(“Thread1 lock resource2”);
}
System.out.println(“Thread1 release resource2”);
}
System.out.println(“Thread1 release resource1”);
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println(“Thread1 is stop”);
}
}
class Thread2 implements Runnable {
@Override
public void run() {
try {
System.out.println(“Thread2 is running”);
synchronized (ThreadResource.resource2) {
System.out.println(“Thread2 lock resource2”);
Thread.sleep(2000);//休眠2s等待线程1锁定资源1
synchronized (ThreadResource.resource1) {
System.out.println(“Thread2 lock resource1”);
}
System.out.println(“Thread2 release resource1”);
}
System.out.println(“Thread2 release resource2”);
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println(“Thread2 is stop”);
}
}
class Thread3 implements Runnable {
@Override
public void run() {
try {
System.out.println(“Thread is running”);
if (ThreadResource.resource1.hashCode() > ThreadResource.resource2.hashCode()) {
//先锁定resource1
synchronized (ThreadResource.resource1) {
System.out.println(“Thread lock resource1”);
Thread.sleep(2000);
synchronized (ThreadResource.resource2)
{
System.out.println(“Thread lock resource2”);
}
System.out.println(“Thread release resource2”);
}
System.out.println(“Thread release resource1”);
} else {
//先锁定resource2
synchronized (ThreadResource.resource2)
{
System.out.println(“Thread lock resource2”);
Thread.sleep(2000);
synchronized (ThreadResource.resource1)
{
System.out.println(“Thread lock resource1”);
最后
整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,
没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
[外链图片转存中…(img-907dnxtP-1714408363244)]
[外链图片转存中…(img-XRVjV7u9-1714408363245)]
其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,