4,023
社区成员
发帖
与我相关
我的任务
分享
public class ForDeadlock {
public static void main(String[] args) {
Counter2 c1 = new Counter2();
Counter2 c2 = new Counter2();
new Thread(()->c1.add(1)).start();
new Thread(()->c2.dec(1)).start();
System.out.println("c1.value = " + c1.value);
System.out.println("c1.another = " + c1.another);
System.out.println("c2.value = " + c2.value);
System.out.println("c2.another = " + c2.another);
}
}
class Counter2{
public final Object lockA=new Object();
public final Object lockB=new Object();
public int count=0;
public int value=0;
public int another=0;
// public synchronized void add(int n){
// if (n<0)dec(-n);
// else count+=n;
// }
// public synchronized void dec(int n){
// count-=n;
// }
public void add(int n){
synchronized (lockA) {
value+=n;
sleep1s();
synchronized (lockB) {
another+=n;
sleep1s();
}
}
}
public void dec(int n){
synchronized (lockB) {
another-=n;
sleep1s();
synchronized (lockA) {
value-=n;
sleep1s();
}
}
}
void sleep1s(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
我的计数器类的两把锁都是 non static 型,按理说每个实例都有各自的两把锁,互不干扰,也不会死锁,但从结果来看,为什么对象1获取不到锁B ,而对象2也获取不到锁A呢?下面是在IDEA中的运行结果,四行结果输出到控制台后还停了一两秒,然后程序自动结束(而不是双方一直等待获得另一把锁)
c1.value = 1
c1.another = 0
c2.value = 0
c2.another = -1
Process finished with exit code 0
请在第6行之后加上Thread.sleep(1000);
main方法的线程优先级高,两个线程由于都休眠了两秒,main方法先执行完,两个线程还没执行完成,所以打印出来的数据没变