title : 每日深耕,勤练不缀之死锁
死锁?
死锁是一种特定的程序状态,由于循环依赖导致彼此一直处在等待之中,没有任何个体可以继续前进。死锁不仅仅发生在线程之间,存在资源独占的进程之间同样也可能发生死锁。通常来说,两个或者多个线程之间,由于相互持有对方需要的锁,而永久处于阻塞的状态
死锁最常见的方式就是利用jstack等工具获取线程栈,然后定位互相之间的依赖关系,进而找到死锁。
如果发生了死锁,绝大多数情况是无法在线解决的,只能重启、修正程序本身问题。
第一、写一个死锁的程序,基础的线程编程一遍考察
public class DeadLockSample extends Thread{
/**
* 这个就是实例化的线程子类,定义了run()方法
* 接下来我们的操作就是在mian方法中创建两个线程来实现争夺两个资源
*/
private String first;
private String second;
public DeadLockSample(String name,String first,String second){//构造函数
super(name);
this.first=first;
this.second=second;
}
public void run(){
synchronized (first){
System.out.println(this.getName()+"obtained:"+first);
try{
Thread.sleep(1000L);
synchronized (second){
System.out.println(this.getName()+"obtained:"+second);
}
}catch (InterruptedException e){
//do nothing
}
}
}
public static void main(String[] args) throws InterruptedException {
String lockA ="lockA";
String lockB ="lockB";
DeadLockSample t1 =new DeadLockSample("Thread1",lockA,lockB);//传参,实参
DeadLockSample t2 =new DeadLockSample("Thread2",lockB,lockA);//传参,实参
t1.start();
t2.start();
t1.join();//记得添加异常处理
t2.join();
}
}
结果
执行并不能结束!!!