package com.pengshi.ThreadTest;
/**
* @description: JUC —— 死锁的案例
* 测试的时候发现一个很有意思的一点,我们可以看到
* private static Object a = "123";
* private static Object b = "123";
* 将锁定义如下,发现不会产生死锁,而是串行执行了,这是因为 这是静态变量,所以 常量池中 引用已经有的值,测试发现整数类型也是如此
* 同理发现在 局部变量 里面 int 和String 也是如此的,String可以理解,因为是final 变量,但是为什么int 也是呢,这要源码了
* 发现也是final修饰的类, Integer 类的值是final修饰,同理与String 一致
*
*
* 验证 是否死锁的 工具
* 使用内置工具 jps
* 类似于linux中 ps -ef
* 使用jstack jvm自带的堆栈跟踪工具
*
* @projectName: Algorithm
* @see: com.pengshi.ThreadTest
* @author: pc
* @createTime: 2022/2/26 11:24
* @version: 1.0
*/
public class DeadLock {
// private static Object a = "123"; // 记住 synchronized 的锁机制 是源于 对象头部 Mark 的,需要时对象才能是锁
// private static Object b = "1234"; // 很有意思的一点
public static void main(String[] args) {
Object a = new String("1");
Object b = new String("1");
Integer c = 1;
Integer d = 1;
System.out.println(c == d);
new Thread(() -> {
synchronized (a) {
System.out.println("线程A尝试获取锁b");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (b) {
System.out.println("线程A获取了锁b");
}
}
}).start();
new Thread(() -> {
synchronized (b) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程B尝试获取锁a");
synchronized (a) {
System.out.println("线程B获取了锁a");
}
}
}).start();
}
}
JUC —— 死锁的概念 以及 对于锁中对象监视器的理解
最新推荐文章于 2024-08-04 11:07:52 发布