在了解死锁之前,必须回顾一下静态变量的概念:static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,
在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,
在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
死锁:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。(百度上面笼统的说法)
在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,
在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
死锁:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。(百度上面笼统的说法)
public class MyDeadLock implements Runnable{
static Object o1 = new Object(),o2 = new Object();
/*这里必须声明为静态,因为这样o1和o2才能被两个线程所共享,并由此产生死锁;否则
* 每个对象都拥有自己的Object,并不能产生死锁现象
* 所以必须了解死锁和静态对象(静态变量)的概念。*/
int a = 1;
MyDeadLock(int a){
this.a = a;
}
public void run() {
System.out.println("No:" + a + "start");
switch(this.a){
case 1:
synchronized (o1) {
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
synchronized (o2) { //这个对象的同步锁必须在前一个锁的里面
System.out.println("No Lock");
}
}
break;
case 2:
synchronized (o2) {
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
synchronized (o1) { //这个对象的同步锁必须在前一个锁的里面
System.out.println("No Lock");
}
}
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new MyDeadLock(1));
Thread t2 = new Thread(new MyDeadLock(2));
t1.start();
t2.start();
}
}