多线程(Day22)

死锁

概述

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或由于彼此通信而造成的一种阻塞现象。若无外力作用,他们将无法进行下去,此时称系统处于死锁状态,这些永远在互相等待的进程称为死锁进程。

原理

1 某个线程执行完成,需要先后 嵌套锁定 两个对象,在这个过程中,先锁定了第一个对象

2 另一个线程执行完成也需要先后嵌套锁定两个对象,在这个过程中,先锁定了第二个对象

3 第一个线程,执行中,要执行到第二个对象的时候,发现被锁定,进入等待状态,等待交出锁

4 第二个线程执行中,要执行到第一个对象的时候,发现被锁定,进入等待状态

5 此时两个线程都在等待对方交出锁,导致死锁

代码实现

单例模式

实现方式

线程通信

概述

Object中的方法

wait:让当前线程进入等待状态(挂起)并释放锁,当被唤醒之后,从接着挂起的位置继续执行。如果无参数,则不会自动醒来,需要唤醒。也可以传入Long类型的值,代表毫秒数,多久之后自动醒来。

notify:唤醒一个在该对象中挂起的任意一个线程。

notiAll:唤醒在该对象中挂起的所有线程。

wait和sleep的区别

wait:让当前线程进入挂起状态并解锁,必须加载在成员方法中。

sleep:让当前线程进入睡眠状态,是静态方法,和是否加锁无关。如果在加锁方法中也不会释放锁。

使用方式

生产者和消费者

概念

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

这个阻塞队列就是用来给生产者和消费者解耦的。纵观大多数设计模式,都会找一个第三者出来进行解耦,如工厂模式的第三者是工厂类,模板模式的第三者是模板类。在学习一些设计模式的过程中,如果先找到这个模式的第三者,能帮助我们快速熟悉一个设计模式。

模型

使用方式

相关推荐
毕设源码-朱学姐16 小时前
【开题答辩全过程】以 4S店汽车维修保养管理系统为例,包含答辩的问题和答案
java·spring boot·汽车
charlie11451419116 小时前
Kotlin 的 apply / with / run 详解
开发语言·kotlin·程序设计·面对对象
Tiger_shl16 小时前
【层面一】C#语言基础和核心语法-02(反射/委托/事件)
开发语言·c#
GW_Cheng16 小时前
分享一个vue2的tinymce配置
开发语言·javascript·ecmascript
路人与大师16 小时前
【Mermaid.js】从入门到精通:完美处理节点中的空格、括号和特殊字符
开发语言·javascript·信息可视化
盖世英雄酱5813616 小时前
Read timed out问题 排查
java·数据库·后端
狼爷16 小时前
破解 JetBrains 的学生,后来都成了它的 “推销员”:一场用习惯换市场的长期战
java·jetbrains
你怎么知道我是队长16 小时前
C语言---循环结构
c语言·开发语言·算法
.豆鲨包17 小时前
【Android】Viewpager2实现无限轮播图
android·java
BXCQ_xuan17 小时前
软件工程实践二:Spring Boot 知识回顾
java·spring boot·后端