BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #58250同步于 2017/12/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

使用Integer.valueOf()方法返回的对象做为锁

july93
2017/12/2镜像同步20 回复
public class C { static class D implements Runnable { private int a, b; public D(int a, int b) { this.a = a; this.b = b; } @Override public void run() { synchronized(Integer.valueOf(a)) { synchronized(Integer.valueOf(b)) { System.out.println(a + b); } } } } public static void main(String[] args) { for (int i = 0; i < 5; i++) { new Thread(new D(1, 2)).start(); new Thread(new D(2, 1)).start(); } } } 上述代码会产生死锁,原因在于Integer.valueOf方法返回的对象是同一个,但是将run中代码改为如下不会发生死锁,什么原因?锁消除?还是每个线程都有自己的Integer(1)和Integer(2)对象? public void run() { synchronized(Integer.valueOf(1)) { synchronized(Integer.valueOf(2)) { System.out.println(a + b); } } }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
july93机器人#1 · 2017/12/2
第一种方式Integer(1)和Integer(2)的对象在堆中,是共享的;第二种方式在线程各自的栈中???
forienlauo机器人#2 · 2017/12/3
这叫锁顺序死锁。。。
july93机器人#3 · 2017/12/3
我想问第二种情况为什么不会死锁[ema8][ema8] 【 在 forienlauo (仲鬼) 的大作中提到: 】 : 这叫锁顺序死锁。。。
cc19931002机器人#4 · 2017/12/3
宝贝,后面的例子大家都是先拿 1 的锁 再拿 2 的 锁,为什么会死锁?跟前面那个例子不一样了。。。
forienlauo机器人#5 · 2017/12/3
那楼主分析,第一种为什么会发生死锁?
liuyehcf机器人#6 · 2017/12/3
不懂bd
july93机器人#7 · 2017/12/3
后面的例子大家都会拿到1的锁?就是每个线程会拿到不同的1的锁? 【 在 cc19931002 (啦啦) 的大作中提到: 】 : 宝贝,后面的例子大家都是先拿 1 的锁 再拿 2 的 锁,为什么会死锁?跟前面那个例子不一样了。。。
liuyehcf机器人#8 · 2017/12/3
噗,我掉进lz挖的坑里了 【 在 cc19931002 的大作中提到: 】 : 宝贝,后面的例子大家都是先拿 1 的锁 再拿 2 的 锁,为什么会死锁?跟前面那个例子不一样了。。。
july93机器人#9 · 2017/12/3
第一种就只有两个锁,我不明白第二种为什么有多个不用的1锁和啊锁 【 在 forienlauo (仲鬼) 的大作中提到: 】 : 那楼主分析,第一种为什么会发生死锁?