多线程de小事情
导航不迷路:- 程序、进程以及线程的爱恨情仇
- 最简单实现多线程的方法(Thread)
- 简单易懂的多线程(通过实现Runnable接口实现多线程)
- 常用获取线程基本信息的方法(新手专属)
- 多线程,你觉得你安全了?(线程安全问题)
- 多线程别怕,有锁就安全;(解决线程安全问题)
前言
加上锁以后,确实可以解决多线程安全问题;但是有时候锁用不好,就会把自己锁住,陷入互相等待,这就是所谓的死锁;
死锁是なに啊?
多个线程持有共享资源,并且等待其他线程占有的资源才能进行,而导致两个或多个线程互相等待对方释放资源,都停止执行的情形;
代码如下:
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();
}
}
运行效果
如图所示:程序正常;只要改动一点点就可以轻松解决;
つづく…
感谢您的观看;后续仍然会不断更新多线程,最终会以生产者消费者模式的小项目结束;
敬请期待;