今天小编给大家分享的是java死锁介绍及避免方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。
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死锁介绍及避免方法就分享到这里了,希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。