Java多线程-47-多线程死锁

       本篇学习什么是多线程死锁,怎么避免线程死锁。这个问题,在面试了应该也经常被提到。关于,线程死锁,有这么一个故事。一个饭桌上,有丰盛的菜肴,圆桌围着几个哲学家,问题来了,每个哲学家只有一根筷子。假如必须得到两根筷子,才能享受菜肴。哲学家们都想从身边的人手里拿到另外一根筷子,结果是谁都说服不了谁,都没有拿到一双筷子,结果哲学家们都饿死了。这个拿不到一双筷子,在电脑里面的线程就是死锁问题。

       多线程死锁,就是在多线程环境中,如果使用了同步代码块嵌套,而且使用同一个锁对象,就很容易发生线程死锁。如果要避免线程死锁,唯一的办法就是尽量不去使用代码块同步嵌套。下面举例一个同步嵌套,造成都拿不到一对筷子的线程死锁问题。

package thread;

public class Demo5_DeadLock {
    public static String s1 = "筷子-左";
    public static String s2 = "筷子-右";
	public static void main(String[] args) {
		
		new Thread() {
			public void run() {
				while(true) {
					synchronized(s1) {
						System.out.println(getName() +"...拿到" + s1 + "等待" + s2);
						synchronized(s2) {
							System.out.println(getName() +"...拿到" + s2 + "开吃");
						}
					}
				}
			}
		}.start();
        
		
		new Thread() {
			public void run() {
				while(true) {
					synchronized(s2) {
						System.out.println(getName() +"...拿到" + s2 + "等待" + s1);
						synchronized(s1) {
							System.out.println(getName() +"...拿到" + s1 + "开吃");
						}
					}
				}
			}
		}.start();
	}

}

运行后,最后两行输出如下,就出现死锁,IDE运行进程没有结束,但是没有执行其他打印代码。

Thread-1...拿到筷子-左开吃
Thread-1...拿到筷子-右等待筷子-左
Thread-0...拿到筷子-左等待筷子-右

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值