美文网首页
Java 多线程之死锁

Java 多线程之死锁

作者: caibixiang | 来源:发表于2018-07-01 19:19 被阅读0次

Java 多线程之死锁:

定义:

    当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞,这个我们都知道。如果线程A持有锁L并且想获得锁M,线程B持有锁M并且想获得锁L,那么这两个线程将永远等待下去,这种情况就是最简单的死锁形式。

eg: 下面是一个造成死线程的例子。

package com.newtouch.multiThread;

public class DeadLockDemo {

private static StringA ="A";

private static StringB ="B";

private void deadLock() {

Thread t1 =new Thread(new Runnable() {

@Override

            public void run() {

synchronized (A) {

try {

Thread.sleep(1000);

}catch (InterruptedException e) {

e.printStackTrace();

}

}

synchronized (B){

System.out.print("1");

}

}

});

Thread t2=new Thread(new Runnable() {

@Override

          public void run() {

synchronized (B){

try {

Thread.sleep(1000);

}catch (InterruptedException e) {

e.printStackTrace();

}

}

synchronized (A){

System.out.print("2");

}

}

});

t1.start();

t2.start();

}

public static void main(String[] args){

new DeadLockDemo().deadLock();

}

}

     线程t1和线程t2,都占有对方拥有的锁,都不能获得锁,这样就形成了死锁。

当然出现死锁的情况很多也很复杂。比如生产者和消费者这种方式情况,以后说到了

notifyAll(),notify(),wait()的时候在举例。

当线程出现了死锁可以通过jps查看当前线程,并用jstak查看堆栈。

具体的大家可以自己百度,这里不做说明。

    避免死锁的几个常见方法:

1.避免一个线程同时获取多个锁。

2.避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。

3.尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。

4.对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

5.设计时考虑清楚锁的顺序,尽量减少嵌在的加锁交互数量

       参考资料:Java并发编程数量。

相关文章

网友评论

      本文标题:Java 多线程之死锁

      本文链接:https://www.haomeiwen.com/subject/olocuftx.html