关于线程死锁
在了解死锁之前,必须回顾一下静态变量的概念: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(); } }