`
sudalyl
  • 浏览: 100236 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

java多线程(3)---线程死锁

阅读更多

    前天俺们谈到了加锁,但是在使用加锁的同时又会带来一个问题,就是死锁。

什么叫死锁?

    所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

那么为什么会产生死锁呢?

      1.因为系统资源不足。

    2.进程运行推进的顺序不合适。    

      3.资源分配不当。

学过操作系统的朋友都知道:产生死锁的条件有四个:

        1.互斥条件:所谓互斥就是进程在某一时间内独占资源。

        2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

        3. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

        4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。


下面让我们来看以个死锁的例子:

 

package com.suda.thread;

public class TestDeadLock implements Runnable {
	public int flag = 1;
	static Object o1 = new Object(), o2 = new Object();
	public void run() {
System.out.println("flag=" + flag);
		if(flag == 1) {
			synchronized(o1) {
				System.out.println("我已经锁定O1,休息0.5秒后锁定O2去!");
				try {
					Thread.sleep(500);
				} catch (Exception e) {
					e.printStackTrace();
				}
				synchronized(o2) {
					System.out.println("1");	
				}
			}
		}
		if(flag == 0) {
			synchronized(o2) {
				System.out.println("我已经锁定O2,休息0.5秒后锁定O1去!");
				try {
					Thread.sleep(500);
				} catch (Exception e) {
					e.printStackTrace();
				}
				synchronized(o1) {
					System.out.println("0");
				}
			}
		}
	}	
	
	public static void main(String[] args) {
		TestDeadLock td1 = new TestDeadLock();
		TestDeadLock td2 = new TestDeadLock();
		td1.flag = 1;
		td2.flag = 0;
		Thread t1 = new Thread(td1);
		Thread t2 = new Thread(td2);
		System.out.println("线程开始喽!");
		t1.start();
		t2.start();
	}
}
线程开始喽!
flag=1
我已经锁定O1,休息0.5秒后锁定O2去!
flag=0
我已经锁定O2,休息0.5秒后锁定O1去!

这样就产生了死锁,这是我们过多的使用同步而产生的。我们在java中使用synchonized的时候要考虑这个问题,如何解决死锁,大家可以从死锁的四个条件去解决,只要破坏了一个必要条件,那么我们的死锁就解决了。在java中使用多线程的时候一定要考虑是否有死锁的问题哦。

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics