• 150455

    文章

  • 1003

    评论

  • 13

    友链

  • 最近新加了换肤功能,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

java死锁


死锁产生的原因

        死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,如果无外力的干涉那它们都将无法推进下去,如果系统的资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。

        1、系统资源不足

        2、进程运行推进的顺序不合适

        3、资源分配不当

总的来说,就是线程运行所需要的锁发生了循环依赖导致了死锁。

写一个死锁demo

package com.atguigu.lock;

class PublicResource{
	private Object obj1;
	private Object obj2;
	
	public PublicResource(Object obj1, Object obj2) {
		this.obj1 = obj1;
		this.obj2 = obj2;
	}
	
	public void operate() throws InterruptedException {
		synchronized (obj1) {
			//注意这里暂停一下,以保证对方线程已获取第一把锁
			Thread.sleep(200);
			
			synchronized (obj2) {
				System.out.println(Thread.currentThread().getName() + "\t" + "执行成功");
			}
		}
	}
}

/** 
* @ClassName: DeadLockTest 
* @Description: TODO
* @author Liu 
* @date 2021年2月21日 上午10:20:25 
*/
public class DeadLockTest {

	public static void main(String[] args) {
		Object obj1 = new Object();
		Object obj2 = new Object();
		
		PublicResource source = new PublicResource(obj1, obj2);
		PublicResource source2 = new PublicResource(obj2, obj1);
		
		new Thread(() -> {
			System.out.println(Thread.currentThread().getName() + "\t" + "启动成功");
			try {
				source.operate();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}, "A").start();
		
		new Thread(() -> {
			System.out.println(Thread.currentThread().getName() + "\t" + "启动成功");
			try {
				source2.operate();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}, "B").start();
	}

}
package com.atguigu.lock;

class PublicResource2{
	private Object obj1 = new Object();
	private Object obj2 = new Object();
	
	public void operate1() throws InterruptedException {
		synchronized (obj1) {
			//注意这里暂停一下,以保证对方线程已获取第一把锁
			Thread.sleep(200);
			
			synchronized (obj2) {
				System.out.println(Thread.currentThread().getName() + "\t" + "执行operate1成功");
			}
		}
	}
	
	public void operate2() throws InterruptedException {
		synchronized (obj2) {
			
			Thread.sleep(200);
			
			synchronized (obj1) {
				System.out.println(Thread.currentThread().getName() + "\t" + "执行operate2成功");
			}
		}
	}
}

/** 
* @ClassName: DeadLockTest 
* @Description: TODO
* @author Liu 
* @date 2021年2月21日 上午10:20:25 
*/
public class DeadLockTest2 {

	public static void main(String[] args) {
		PublicResource2 source = new PublicResource2();
		
		new Thread(() -> {
			System.out.println(Thread.currentThread().getName() + "\t" + "启动成功");
			try {
				source.operate1();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}, "AAA").start();
		
		new Thread(() -> {
			System.out.println(Thread.currentThread().getName() + "\t" + "启动成功");
			try {
				source.operate2();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}, "BBB").start();
	}

}

死锁定位排查

1、jps命令获取java进程编号

jps -l

2、jstack命令获取死锁堆栈信息

jstack 13012


695856371Web网页设计师②群 | 喜欢本站的朋友可以收藏本站,或者加入我们大家一起来交流技术!

0条评论

Loading...


发表评论

电子邮件地址不会被公开。 必填项已用*标注

自定义皮肤 主体内容背景
打开支付宝扫码付款购买视频教程
遇到问题联系客服QQ:419400980
注册梁钟霖个人博客