重学java 40.多线程 — 死锁和线程状态

news/2024/12/22 9:57:52/

                —— 24.5.

一、死锁

1.死锁介绍(锁嵌套就有可能产生死锁)

指的是两个或者两个以上的线程在执行的过程中由于竞争同步锁而产生的一种阻塞现象;如果没有外力的作用,他们将无法继续执行下去,这种情况称之为死锁

例:

两线程处于互相等待的状态,就是死锁在程序中的死锁出现在同步代码块的嵌套中,这种情况下同样有很小的可能不出现死锁,以后尽量避免锁嵌套

2.死锁状态

LockA

java">package S75DieLock;public class LockA {// 定义一个锁对象public static LockA lockA = new LockA();
}

LockB

java">package S75DieLock;public class LockB {// 定义一个锁对象public static LockB lockB = new LockB();
}

死锁DieLock

java">package S75DieLock;public class DieLock implements Runnable{private boolean flag;public DieLock(boolean flag){this.flag = flag;}@Override// 重写run方法public void run(){if (flag){synchronized (LockA.lockA){System.out.println("if ... lockA");synchronized (LockB.lockB){System.out.println("if ... lockB");}}}else {// 套件锁Asynchronized (LockB.lockB){System.out.println("else ... lockB");synchronized (LockA.lockA){System.out.println("if ... lockA");}}}}
}

测试类

java">package S75DieLock;public class Demo214Test {public static void main(String[] args) {DieLock dieLock1 = new DieLock(true);DieLock dieLock2 = new DieLock(false);new Thread(dieLock1).start();new Thread(dieLock2).start();}
}

有时也会产生一个进程率先进入打开了所有锁的状态

二、线程状态

1.线程状态介绍

①sleep(time)和wait(time)有啥区别?

        a.sleep(time):线程睡眠,在睡眠的过程中,线程是不会释放锁,此时其他线程抢不到锁,设置的时间旦超时,自动醒来,继续执行
        b.wait(time):线程等待,在等待的过程中会释放锁,其他线程就有可能抢到锁,如果在等待的过程中被唤醒或者时间超时,会和其他的线程重新抢锁,如果抢到了继续执行,抢不到,锁阻塞

②wait()和notify():

        a.wait():空参wait,线程进入到无限等待状态,会释放锁,需要其他线程调用notify(一次唤醒一条等待的线程,唤醒是随机的)或者notifyAII方法(将所有等待线程全唤醒),被唤醒之后,会和其他的线程重新抢锁,抢到了,继续执行;抢不到,锁阻塞
        b.notify():notify会唤醒正在等待的线程,一次只能唤醒一条等待的线程;如果要是多条线程在等待,notify会随机一条唤醒;
        c.notifyAll():唤醒所有等待的线程

③wait()和notify()两个方法的用法:

        a.两个方法都需要锁对象调用,所以两个方法需要用到同步代码块,同步方法

        b.两个方法的调用必须是同一个锁对象调用可以理解为用同一个锁对象,将多条线程分到了一组中,这样notify就知道唤醒的是自己本组的等待线程


http://www.ppmy.cn/news/1462600.html

相关文章

深度学习之基于YoloV7-Deepsort的人群流量统计系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着城市化进程的加快和人口数量的不断增长,公共场所的人群流量管理变得越来越重要…

HTML5 性能优化和计算机硬件使用

目录 启用硬件加速图像与媒体优化资源加载与缓存CSS与布局优化JavaScript性能优化浏览器兼容性与特性检测启用硬件加速 Canvas绘图 <canvas> 元素支持硬件加速,可以显著提升图形绘制和动画的性能。确保在支持的浏览器中启用硬件加速,如使用translate3d(0, 0, 0) hack…

VUE 创建组件常见的几种方式

在 Vue.js 中&#xff0c;组件的创建和使用通常遵循以下三种方法&#xff1a; 1. 全局组件 全局组件是通过 Vue.component() 方法创建的&#xff0c;注册后的组件可以在任何新创建的 Vue 实例&#xff08;包括根实例&#xff09;的模板中使用。 Vue.component(my-component,…

LeetCode-105-岛屿的最大面积

题目描述&#xff1a;给定一个由 0 和 1 组成的非空二维数组 grid &#xff0c;用来表示海洋岛屿地图。 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0&#xff08…

【HarmonyOS尝鲜课】- 前言

面向人群 本课程适用于HarmonyOS应用开发的初学者。 有无经验的开发者都可以轻松掌握ArkTS语言声明式开发范式&#xff0c;体验更简洁、更友好的HarmonyOS应用开发旅程。 什么是HarmonyOS HarmonyOS&#xff08;鸿蒙操作系统&#xff09;是由华为技术有限公司开发的全场景分…

hls.js实现分片播放视频

前言&#xff1a;hls.js官网&#xff1a;hls.js - npm 一、demo——在HTML中使用 <audio id"audio" controls></audio><script src"https://cdn.jsdelivr.net/npm/hls.jslatest"></script> <script>document.addEventList…

css左右滚动互不影响

想实现左右都可以滚动&#xff0c;且互不影响。 只需要再左边的css里面 .threedlist {cursor: pointer;width: 280px;position: fixed;height: 100vh; /* 定义父容器高度 */overflow-y: auto; /* 只有在内容超过父容器高度时才出现滚动条 */} 如果想取消滚动条样式 .threedli…

elementUI使用el-tabs加el-form导致页面崩溃以及el-form里的input事件丢失问题

elementUI使用el-tabs加el-form导致页面崩溃以及el-form里的input事件丢失问题 解决 el-form外面包一层el-row和el-col&#xff0c;el-tabs也包一层 el-fom e-tabs