线程死锁问题

Java线程死锁 
Java线程死锁是一个多线程问题,是指不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成。
例如有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮流吃饭。他们都需要获得两个锁:共享刀和共享叉的锁。 假如线程 “A”获得了刀,而线程“B”获得了叉。线程“A”就会进入阻塞状态来等待获得叉,而线程“B”则阻塞来等待“A”所拥有的刀。这种现象就成为死锁。如下例所示
 
class DeadLockThread implements Runnable {
	static Object chopsticks = new Object();    // 定义Object类型的chopsticks锁对象
	static Object knifeAndFork = new Object(); // 定义Object类型的knifeAndFork锁对象
	private boolean flag; // 定义boolean类型的变量flag
	DeadLockThread(boolean flag) { // 定义有参的构造方法
		this.flag = flag;
	}
	public void run() {
		if (flag) {
			while (true) {
				synchronized (knifeAndFork) { // chopsticks锁对象上的同步代码块
					System.out.println(Thread.currentThread().getName()
							+ "得到了刀,在等叉"); 
					synchronized (chopsticks) { // knifeAndFork锁对象上的同步代码块
						System.out.println(Thread.currentThread().getName()
								+ "得到了叉,在等刀"); 
					}
				}
			}
		} else {
			while (true) {
				synchronized (chopsticks) { // knifeAndFork锁对象上的同步代码块
					System.out.println(Thread.currentThread().getName()
							+ "得到了叉,在等刀"); 
					synchronized (knifeAndFork) { // chopsticks锁对象上的同步代码块
						System.out.println(Thread.currentThread().getName()
								+ "得到了刀,在等叉"); 
					}
				}
			}
		}
	}
}
public class Example2 {
	public static void main(String[] args) {
         // 创建两个DeadLockThread对象
		DeadLockThread d1 = new DeadLockThread(true);
		DeadLockThread d2 = new DeadLockThread(false);
         // 创建并开启两个线程
		new Thread(d1, "A").start();   // 创建开启线程Chinese
		new Thread(d2, "B").start(); // 创建开启线程American
		System.out.println("都在等,死锁了");
	}
}
结果:
都在等,死锁了
A得到了刀,在等叉
B得到了叉,在等刀
 
 
如何避免Java线程死锁问题:
①让所有的线程按照同样的顺序获得一组锁。这种方法消除了 A和 B 的拥有者分别等待对方的资源的问题。
② 将多个锁组成一组并放到同一个锁下。前面Java线程死锁的例子中,可以创建再一个对象的锁。于是在获得刀或叉之前都必须获得这个银器的锁。 
③将那些不会阻塞的可获得资源用变量标志出来。当某个线程获得银器对象的锁时,就可以通过检查变量来判断是否整个银器集合中的对象锁都可获得。如果是,它就可以获得相关的锁,否则,就要释放掉银器这个锁并稍后再尝试。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值