产生死锁的四个必要条件:
上面列出了死锁的四个必要条件,我们只要想办法破其中的任意一个或多个条件就可以避免死锁的发生
public class TextDemo {
public static void main(String[] args) {
bb b1=new bb(0,"乔丹");
bb b2=new bb(1,"林丹");
b1.start();
b2.start();
}
}
// 篮球
class basketball{
}
// 羽毛球
class badminton{
}
class bb extends Thread{
// 需要的资源只有一份,用static来保证只有一份
static basketball basketball = new basketball();
static badminton badminton = new badminton();
// 选择
int choice;
// 使用球的人
String grilnmae;
bb(int choice,String grilnmae){
this.choice = choice;
this.grilnmae = grilnmae;
}
@Override
public void run() {
// 打球
try {
bb();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void bb() throws InterruptedException {
if(choice == 0){
synchronized (basketball){// 获得篮球的锁
System.out.println(this.grilnmae+"获得了篮球");
Thread.sleep(1000);
synchronized (badminton){// 获得羽毛球队锁
System.out.println(this.grilnmae+"获得了羽毛球");
}
}
}else {
synchronized (badminton){// 获得羽毛球的锁
System.out.println(this.grilnmae+"获得了羽毛球");
Thread.sleep(2000);
synchronized (basketball){// 获得篮球队锁
System.out.println(this.grilnmae+"获得了篮球");
}
}
}
}
}
这里已经产生死锁了,程序不会再往下运行,就一直卡在这里。
因为程序毕竟不是人,只会执行,不会思考。代码还需人打。
所以两个线程分别报了对方的锁,导致双方僵持不下,程序无法运行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MFdCJfSb-1617976936606)(D:\学习\tupian\多线程\线程同步\s2.png)]
解决方法如下:
点击图片 放大观看
public class LockDemo {
public static void main(String[] args) {
TestLock t = new TestLock();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class TestLock implements Runnable{
int ticketNums = 10;
// 定义lock锁
private final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while (true){
try {
// 加锁
lock.lock();
if (ticketNums > 0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(ticketNums--);
}else{
break;
}
}finally {
// 解锁
lock.unlock();
}
}
}
}
表单验证是web前端最常见的功能之一,也属于前端开发的基本功。自己完成一个表单...
1. 虚拟机的世界 一个安静的夜晚,我,一个新的线程诞生了! 我抬头一看,原来我...
前言 前几天跟一位朋友分析了一个死锁问题,所以有了这篇图文详细的博文,哈哈~ ...
本文重点介绍创建对象和使用对象的内存分配问题我尽量用简单的方法帮助大家理解n...
大家在.NET中处理XML文档的时候,经常会需要找到文档中的某个节点的数据。要找到...
1 Android屏幕适配相关概念 1.1 屏幕尺寸(Screen Size) 屏幕尺寸是屏幕的对角线...
使用Ajax可以异步获取数据,可以更高效地渲染页面。 但也存在这一些问题: 再刷...
2021湖南多校对抗赛第三场 排名 第一 第二 第三 团体成绩 学校 总题数 总罚时 题...
手机号 手机名称有GSM:表示只支持中国联通或者中国移动2G号段(130、131、132、...
在***DAOImpl.java中的代码如下 复制代码 代码如下: public String getCompuName...