温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java死锁介绍及避免方法

发布时间:2020-04-22 14:20:02 来源:亿速云 阅读:200 作者:小新 栏目:编程语言

今天小编给大家分享的是java死锁介绍及避免方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。

  • 死锁的介绍:
    锁是一个非常有用的工具,运行场景非常多,因为它使用起来非常简单,而且易于理解。但同时它也会带来一些困扰,比如死锁问题。比如有两个线程A和B,运行都需要两个资源a,b。A获取了a资源,B获取了b资源,接着A去请求b资源,B去请求a资源,两个线程互相阻塞产生死锁。

  • 代码示例:

public calss DeadLockDemo{
	private static String A = "A";
	private static String B = "B";
	public static void main(String[] args){
		new DeadLockdemo().deadLock();
	}
	private void deadLock(){
		Thread t1 = new Thread(new Runnable(){
			@Override
			public void run(){
				synchronized(A){
					try{
						Thread.currentThread().sleep(2000);
					}catch(Exception e){
					  e.printStackTrace();
					 }
					 synchronized(B){
					 	System.out.println("B");
					 }
				}
			}
		});
		Thread t2 = new Thread(new Runnable(){
			@Override
			public void run(){
				synchronized(B){
					try{
						Thread.currentThread().sleep(2000);
					}catch(Exception e){
					  e.printStackTrace();
					 }
					 synchronized(A){
					 	System.out.println("A");
					 }
				}
			}
		});
		t1.start();
		t2.start();
	}
}

上述代码执行后会发生死锁,t1和t2互相阻塞。

  • 死锁产生的场景分析:
    在一个更为复杂的场景中,你可能会遇到这样的问题,t1拿到锁之后,因为一些异常情况而没有释放锁(死循环)。或者t1拿到了一个数据库锁,释放锁的时候抛出了异常没释放掉。

  • 避免死锁的几种方法:
    1.尽量避免一个线程同时获取多个锁。
    2.尽量避免一个线程同时占据多个支援,尽量一个线程同时只占据一个资源。
    3.尝试使用定时锁。Lock.tryLock(timeout)来代替使用内部锁机制。
    4.对于数据库锁,加锁和解锁必须在一个数据库连接里进行。

关于java死锁介绍及避免方法就分享到这里了,希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI