zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【JAVA】死锁机制

JAVA 机制 死锁
2023-09-11 14:20:37 时间

死锁

死锁是两个或更多线程阻塞等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候

例如,如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A进行加锁,这时死锁就发生了。线程1永远得不到B,线程2也永远得不到A,并且它们永远也不会知道发生了这样的事情。为了得到彼此的对象(A和B),它们将永远阻塞下去。这种情况就是一个死锁。

                                     

如果线程1稍微领先线程2,然后成功地锁住了A和B两个对象,那么线程2就会在尝试对B加锁的时候被阻塞,这样死锁就不会发生。因为线程调度通常是不可预测的,因此没有一个办法可以准确预测什么时候死锁会发生,仅仅是可能会发生。

 


class TTT extends Thread {
    private Integer p1 = null;
    private Integer p2 = null;
    private String name = null;

    public TTT(Integer p1, Integer p2, String name) {
        this.p1 = p1;
        this.p2 = p2;
        this.name = name;
    }

    public void run() {
        /**
         * 死锁(这里出现死锁的原因就是交叉访问锁造成的)
         */
//        try {
//            if ("张三".equals( this.name )) {
//                synchronized (p2) {
//                    Thread.sleep( 10 );
//                    synchronized (p1) {
//
//                    }
//                }
//            } else {
//                synchronized (p1) {
//                    Thread.sleep( 10 );
//                    synchronized (p2) {
//
//                    }
//                }
//            }
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

        /**
         * 修改后
         */
        try {
            if ("张三".equals( this.name )) {
                synchronized (p1) {
                    Thread.sleep( 10 );
                    synchronized (p2) {

                    }
                }
            } else {
                synchronized (p1) {
                    Thread.sleep( 10 );
                    synchronized (p2) {

                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static class 死锁 {
        public static void main(String[] args) {
            Integer p1 = 11;
            Integer p2 = 22;
            TTT t1 = new TTT( p1, p2, "张三" );
            TTT t2 = new TTT( p1, p2, "李四" );

            t1.start();
            t2.start();
            System.out.println();
        }
    }
}