本篇文章给大家带来的内容是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并发学习之什么是死锁?死锁的介绍的详细内容。