关于线程死锁

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

	}


}


posted @ 2015-05-06 18:34  awenzero  阅读(131)  评论(0编辑  收藏  举报