给女朋友讲编程(3) – 线程死锁 (你预测了我预测你的预测)


基本概念

线程死锁是一个什么东西呢 ?

要知道线程死锁之前, 我们需要先讲一下线程是一个什么东西 ?

进程就是一个个的应用程序, 比如钉钉呐~ 微信呐~ 之类的, 线程就是一个个应用程序下的执行路径 !

乐说=>

比如微信需要显示对方消息的同时, 还要接收我们打字, 这两个功能呢就需要占用两个线程来完成, 所以线程其实就可以把它当成公司里为了完成同一件事情而奋斗着的人们甲乙丙丁啦~


起因

那么有一天呢, 甲方一零和乙方阿乐, 诶~

这两个憨憨线程之间似乎产生了一丝丝妙不可言的联系, 让我们来看看发生了什么叭~

006CXrEjly1geb05suhnhj30gl0glgoa

经过

哦豁~ 原来是擦枪走火了呀~ 啊哈哈哈~

两个人都是死要面子活受罪, 明明互相喜欢都憋着不说呢?

(注: 一零阿乐为了保证线程安全, 都给自己加上了synchronized关键字 (保证线程安全的方式, 加锁))

一零内心呢, 希望阿乐表白(zhuanzhang), 然后她就考虑考虑, 也迈出最后那一步~

1
2
3
4
5
6
7
8
9
static class Yiling{
public synchronized void heartOS(Ale le){
System.out.println("一零内心os:你说出你爱我,我就做你女朋友");
le.aleExpect();
}
public synchronized void yilingExpect(){
System.out.println("一零透露出了我对你有好感, 阿乐向一零表白");
}
}

阿乐内心呢也想知道一零对他的看法, 于是也想等她先透露透露内心的想法

1
2
3
4
5
6
7
8
9
static class Ale{
public synchronized void heartOS(Yiling yiling){
System.out.println("阿乐内心os:你透露出你对我有好感,我就向你表白");
yiling.yilingExpect();
}
public synchronized void aleExpect(){
System.out.println("阿乐说出了我爱你,一零做了阿乐的女朋友");
}
}

结果呢, 就发生了很多很多次的犹豫不决

两个人都在互相猜测, 僵持在这了, 程序无法正常结束

这就是线程死锁啦~

但僵持多了呢, 总有人僵持不住, 可能会先一步说出来, 于是……再僵持了十几次之后

阿乐终于憋不住了, 动作稍微快了一点, 突破了这层僵持 (线程没有锁住), 两个憨憨线程成功在一起啦~

(当然, 也有可能是被胁迫的, 咳咳~)

image-20201020152818269

咋滴, 屏幕前的你们还希望我俩一直僵在这呀~

哼哼, 不可能的, 我i7的处理器在我执行了个十几次之后总算是给了我个面子, 没能锁住我们, 一个不留神突破锁了

所以, 最后的结果我俩在一起是不会变的~

别馋我家一零了~

c854b0faad27dc1c8d30c73cc0c5f30

总结:

所以呀, 我总结线程死锁就一句话:

你预测了我预测你的预测!!!

或者

犹豫就会败北~

那么怎么解决线程死锁的问题呢 ?

=> 在有可能产生锁的方法里不要再调用另一个方法让锁产生

简单来说就是, 把阿乐的锁给拿掉, 大声说出来就完事儿啦~ 是男人你就说出来啊啊啊 !! (虽然如此, 阿乐怂的一批)


最后

所以广大男同胞们, 不要僵持了啦, 身为男人总要先上的嘛~ 学完线程死锁就赶紧动起来叭~

爱就要大胆说出来嘛~

说不定对方也是这么想的哦~

嘻嘻祝你们成功

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.java.demo44;

/**
* @author: Aleo阿乐
* @date: 2020/10/20
* @time: 10:07
*/
public class Test13 {
public static void main(String[] args) {
//线程死锁
Yiling yi = new Yiling();
Ale le = new Ale();
new MyThread(yi,le).start();
yi.heartOS(le);
}

static class MyThread extends Thread{
private Yiling yi;
private Ale le;
MyThread(Yiling yi,Ale le){
this.yi = yi;
this.le = le;
}

@Override
public void run() {
le.heartOS(yi);
}
}
static class Yiling{
public synchronized void heartOS(Ale le){
System.out.println("一零内心os:你说出你爱我,我就做你女朋友");
le.aleExpect();
}
public synchronized void yilingExpect(){
System.out.println("一零透露出了我对你有好感, 阿乐向一零表白");
}
}
static class Ale{
public synchronized void heartOS(Yiling yiling){
System.out.println("阿乐内心os:你透露出你对我有好感,我就向你表白");
yiling.yilingExpect();
}
public synchronized void aleExpect(){
System.out.println("阿乐说出了我爱你,一零做了阿乐的女朋友");
}
}
}

想看我俩僵持的请执行代码~

想吃狗粮的请执行10次代码

我们总有一个线程会突破锁在一起哒~

本篇纯属娱乐, 想正经学多线程的xdm请移步下方正经文链接~

Java - 多线程基础 (我写的呀!!)