锁用不好,可能把自己锁住哦!(解决多线程的死锁问题)

多线程de小事情

导航不迷路:
  1. 程序、进程以及线程的爱恨情仇
  2. 最简单实现多线程的方法(Thread)
  3. 简单易懂的多线程(通过实现Runnable接口实现多线程)
  4. 常用获取线程基本信息的方法(新手专属)
  5. 多线程,你觉得你安全了?(线程安全问题)
  6. 多线程别怕,有锁就安全;(解决线程安全问题)


前言

加上锁以后,确实可以解决多线程安全问题;但是有时候锁用不好,就会把自己锁住,陷入互相等待,这就是所谓的死锁;


死锁是なに啊?

多个线程持有共享资源,并且等待其他线程占有的资源才能进行,而导致两个或多个线程互相等待对方释放资源,都停止执行的情形;

代码如下:

public class DeadLock2 extends Thread{
	
	private Object car;//共享资源车
	private Object people;//共享资源人
	public boolean flag;//标识持有对象锁
	
	
	public DeadLock2(Object car, Object people) {
		super();
		this.car = car;
		this.people = people;
	}


	@Override
	public void run() {
		if(flag) {
			synchronized (car) {
				System.out.println("有辆车,但没人开");
				try {
					Thread.sleep(1000);
				} catch (Exception e) {
					// TODO: handle exception
				}
				synchronized (people) {
					System.out.println("有个人,但没车开");
				}
			}
		}else {
			synchronized (people) {
				System.out.println("有个人,但没车开");
				try {
					Thread.sleep(1000);
				} catch (Exception e) {
					// TODO: handle exception
				}
				synchronized (car) {
					System.out.println("有辆车,但没人开");
				}
			}
		}
	}

}

测试类

public class DeadLock2Test {
	public static void main(String[] args) {
		Object car = new Object();
		Object people = new Object();
		
		DeadLock2 dl = new DeadLock2(car, people);
		DeadLock2 dl2 = new DeadLock2(car, people);
		
		dl.flag=true;
		dl2.flag = false;
		
		dl.start();
		dl2.start();
		
	}
}

运行效果

如图所示:两个线程都执行了一半,便处于等待状态;
在这里插入图片描述

解决死锁

导致死锁的原因是:一个代码块持有多个同步锁而造成的;
只要一个代码块,不要同时持有两个对象的同步锁就可以解决死锁问题;

代码如下:

public class DeadLock2 extends Thread{
	
	private Object car;//共享资源车
	private Object people;//共享资源人
	public boolean flag;//标识持有对象锁
	
	
	public DeadLock2(Object car, Object people) {
		super();
		this.car = car;
		this.people = people;
	}


	@Override
	public void run() {
		if(flag) {
			synchronized (car) {
				System.out.println("有辆车,但没人开");
				try {
					Thread.sleep(1000);
				} catch (Exception e) {
					// TODO: handle exception
				}
				
			}
			synchronized (people) {
				System.out.println("有个人,但没车开");
			}
		}else {
			synchronized (people) {
				System.out.println("有个人,但没车开");
				try {
					Thread.sleep(1000);
				} catch (Exception e) {
					// TODO: handle exception
				}
			}
			synchronized (car) {
				System.out.println("有辆车,但没人开");
			}
		}
	}

}

测试类

package com.bjsxt.thread;

public class DeadLock2Test {
	public static void main(String[] args) {
		Object car = new Object();
		Object people = new Object();
		
		DeadLock2 dl = new DeadLock2(car, people);
		DeadLock2 dl2 = new DeadLock2(car, people);
		
		dl.flag=true;
		dl2.flag = false;
		
		dl.start();
		dl2.start();
		
	}
	
}

运行效果

如图所示:程序正常;只要改动一点点就可以轻松解决;
在这里插入图片描述


つづく…

感谢您的观看;后续仍然会不断更新多线程,最终会以生产者消费者模式的小项目结束;
敬请期待;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值