死锁:两个或两个以上的线程在争夺资源的过程中,发生的一种互相等待的现象
线程1先获取锁locka,然后在同步块里嵌套竞争锁lockb。而线程2先获取锁lockb,然后在同步块里嵌套竞争锁locka
(说明:此时locka此时已经被线程1拥有,而线程1正在等待lockb;而lockb此时已经被线程2拥有,线程2正在等待locka…无线等待对方释放自己所需要的锁,从而陷入死锁)
package test;
public class DeathLock {
private static Object locka = new Object();
private static Object lockb = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized(locka){
System.out.println("正在执行线程1-----线程1获得锁");
synchronized(lockb){
System.out.println("正在执行线程1-----线程2获得锁");
}
}
}
},"线程1");
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized(lockb){
System.out.println("正在执行线程2-----线程2获得锁");
synchronized(locka){
System.out.println("正在执行线程2-----线程1获得锁");
}
}
}
},"线程2");
thread1.start();
thread2.start();
}
}
java线程:既然可以继承Thread类,为什么还有实现Runnable借口这种方式?
1.可以避免由于java单继承带来的局限性;
2.适合多个相同程序的代码去处理同一个资源的情况(列如:卖电影票),把线程同程序的代码、数据有效分离,较好的体现了面向对象的设计思想。