理解java线程

2017-08-16  本文已影响0人  _hello__world_
image.png
public class Deadlock implements Runnable{
    private int a;
    private int b;

    public Deadlock(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public int getB() {
        return b;
    }

    public void setB(int b) {
        this.b = b;
    }

    @Override
    public void run() {
        synchronized (Integer.valueOf(a)){
            synchronized (Integer.valueOf(b)){
                System.out.println("a+b="+(a+b));
            }
        }
    }

    public static void main(String[] args) {
        for(int i=0;i<1024;++i){
            new Thread(new Deadlock(1,2)).start();
            new Thread(new Deadlock(2,1)).start();
        }
    }

}

多次执行main方法,会发生死锁,死锁的原因是我们调用了Integer.valueOf()方法,这个方法是基于减少创建对象次数和节省内存设计的,出于这个的考虑,在[-128~127]之间的数字会被缓存掉,也就是我们循环中传输了那么多的1和2其实就返回的2个,当某个对象持有1,而另外一个对象持有2的时候,第一个等待2的释放,而第二个等待1的释放,因此就发生了死锁。其实这个程序的循环也是不需要的,2个线程就可能引发死锁,但是程序执行太快,概率太小,加一个1000次的循环就是为了增大这种概率。

上一篇 下一篇

猜你喜欢

热点阅读