返回信息流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);
}
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #58250同步于 2017/12/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
使用Integer.valueOf()方法返回的对象做为锁
july93
2017/12/2镜像同步20 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
后面的例子大家都会拿到1的锁?就是每个线程会拿到不同的1的锁?
【 在 cc19931002 (啦啦) 的大作中提到: 】
: 宝贝,后面的例子大家都是先拿 1 的锁 再拿 2 的 锁,为什么会死锁?跟前面那个例子不一样了。。。
噗,我掉进lz挖的坑里了
【 在 cc19931002 的大作中提到: 】
: 宝贝,后面的例子大家都是先拿 1 的锁 再拿 2 的 锁,为什么会死锁?跟前面那个例子不一样了。。。
第一种就只有两个锁,我不明白第二种为什么有多个不用的1锁和啊锁
【 在 forienlauo (仲鬼) 的大作中提到: 】
: 那楼主分析,第一种为什么会发生死锁?