关于线程死锁

来源:互联网 发布:视频动画软件手里 编辑:程序博客网 时间:2024/06/05 03:55
在了解死锁之前,必须回顾一下静态变量的概念: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();}}


0 0