这个线程同步为什么没死锁

cellia 2019-10-24 02:59:39


public class Test {
private static String s1 = "";
private static String s2 = "";

public static void main(String[] args) {
Thread t1 = new Thread() {
public void run() {
synchronized (s1) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s2) {
System.out.println("............");
}
}
}
};
Thread t2 = new Thread() {
public void run() {
synchronized (s2) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s1) {
System.out.println("............");
}
}
}
};

t1.start();
t2.start();

}

}


刚被问到的时候有点懵,分析以下感觉好坑
...全文
59 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zucc_wy 2019-11-08
  • 打赏
  • 举报
回复
楼主如果把s1 和 s2的值换成不同的,就发现会死锁了,可以多了解了解JVM底层原理,包括锁的信息在哪,以及对象在JVM中的存储结构
zucc_wy 2019-11-08
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
这不是s1==s2,都是指向常量池对象,所以锁的是同一个对象

这位老哥正解,跟我想的一样
qq_39936465 2019-10-24
  • 打赏
  • 举报
回复
引用 楼主 cellia 的回复:
刚被问到的时候有点懵,分析以下感觉好坑
synchronized是jvm控制的,执行完就会自动释放锁。
kkkkk0lllll 2019-10-24
  • 打赏
  • 举报
回复
拿到锁的人,正常执行代码后,就会把锁释放掉,为什么会死锁? 相互等待,又不释放已经拿到的锁,才会形成死锁呢
qybao 2019-10-24
  • 打赏
  • 举报
回复
这不是s1==s2,都是指向常量池对象,所以锁的是同一个对象

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧