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

                —— 24.5.

一、死锁

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

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

例:

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

2.死锁状态

LockA

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

LockB

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

死锁DieLock

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");}}}}
}

测试类

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.mzph.cn/pingmian/14912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上位机图像处理和嵌入式模块部署(mcu常见三种烧录方法)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 和单纯的windows上位机开发、嵌入式linux开发不一样,mcu的开发,是需要通过烧录器把编译好的镜像烧入到开发板里面的。这是很…

Spark RDD 操作实战

Spark RDD 基础 更多spark相关知识请查看官方接口文档 PySpark是Spark的PythonAPI,允许Python调用Spark编程模型。 配置spark环境 !apt-get install openjdk-8-jdk-headless -qq > /dev/null !wget -q www-us.apache.org/dist/spark/spark-2.4.8/spark-2.4.8…

16、Go Gin 深入理解Gin中间件

中间件介绍 Gin框架允许开发者在处理请求的过程汇总,加入用户自己的钩子(Hook)函数 这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑 比如登录认证,权限校验、数据分页、记录日志、耗时统计等 1、全局中…

STM32通用定时器的应用实例(基于STM32F103)

目录 概述 1 STM32Cube配置项目 1.1 准备环境 1.2 配置项目参数 1.3 生成Project 2 HAL函数 2.1 初始化函数:HAL_TIM_Base_Init 2.2 中断模式启动定时器函数:HAL_TIM_Base_Start 2.3 定时器回调函数: HAL_TIM_PeriodElapsedCallback…

ElasticSearch操作之重置密码脚本

ElasticSearch操作之重置密码脚本 #!/bin/bash # 使用样例 ./ES密码重置.sh 旧密码 新密码# 输入旧密码 es_old_password$1# 设置新的密码变量 es_password$2# 正确响应 es_reponse{"acknowledged":true}# 检查Elasticsearch是否在运行 if pgrep -f elasticsearch &g…

2024年5月计算机视觉论文推荐:包括扩散模型、视觉语言模型、图像编辑和生成、视频处理和生成以及图像识别等各个主题

我们今天总结下2024年5月发表的最重要的论文,重点介绍了计算机视觉领域的最新研究和进展,包括扩散模型、视觉语言模型、图像编辑和生成、视频处理和生成以及图像识别等各个主题。 Diffusion Models 1、Dual3D: Efficient and Consistent Text-to-3D Ge…

数据赋能(98)——概念:数据整理、数据整合、数据处理

此文为本人学习与提高能力的笔记。 数据整理、数据整合与数据处理这三个术语,尽管在不少情境下可能被看作是近义词或拥有类似的语义范畴,但为了确保术语使用的精准度和专业性,我们必须对其有更为深入的认知。这三个概念虽在某种程度上相互交…

【C++题解】1697. 请输出n~1之间所有的整数

问题:1697. 请输出n~1之间所有的整数 类型:循环 题目描述: 从键盘读入一个整数 n ,请输出 n∼1 之间所有的整数,每行输出 1 个。 比如,假设读入 n5 ,输出结果如下: 5 4 3 2 1 输入&#xff1…

php 亚马逊AWS-S3对象存储上传文件

最近做国外项目的时候,需要把文件上传到AWS-S3对象存储空间里,下面整理一下上传方法,和碰到的问题 代码 /*** 亚马逊oss Aws上传* composer require aws/aws-sdk-php* param $filePath* param $ossPath* return array* author wzb* data 202…

Java进阶学习笔记4——Static应用知识:代码块

代码块: 代码块是类的五大成员之一(成员变量、构造器、方法、代码块、内部类)。 Java类生命周期:加载、验证、准备、初始化、卸载。 代码块分为两种: 静态代码块: 格式:static {} 特点&…

SpringBoot 集成 Nebula

工作需求&#xff0c;开始了解图数据库&#xff0c;经过工具选型&#xff0c;最终选择nebula graph&#xff0c;并集成到springboot&#xff0c;java 环境下如何对 Nebula Graph 进行操作&#xff0c;本文整理下过程。 1、首先引入 pom 依赖 <dependency><groupId&g…

如何理解栈的增长方向

1、概念 函数调用栈&#xff0c;简称栈。不管是函数的执行还是函数调用&#xff0c;栈都起着非常重要的作用 保存函数的局部变量向被调用函数传递参数返回函数的返回值保存函数的返回地址。返回地址是指从被调用函数返回后调用者应该继续执行的指令地址 该文章会帮你很好的了…

Flutter 中的 ClipPath 小部件:全面指南

Flutter 中的 ClipPath 小部件&#xff1a;全面指南 在Flutter中&#xff0c;ClipPath是一个强大的小部件&#xff0c;它允许你通过一个路径来裁剪其子组件。这意味着你可以将任何小部件裁剪成圆形、矩形、或者任何你能通过Path定义的形状。本文将提供一个全面的指南&#xff…

AWS数据库之MemoryDB for Redis

NoSQL&#xff08;非关系型数据库&#xff09;通常可以分为内存数据库、文档数据库、图数据库、时序数据库等等。 适用于 Redis 的 MemoryDB 是一项耐用的内存数据库服务&#xff0c;可提供超快性能。它专为采用微服务架构的现代应用程序而构建。 MemoryDB 与 Redis&#xff…

鸿蒙系统与OpenHarmony:中国科技行业的新动力与就业前景

背景 经历近年来的迅猛发展&#xff0c;鸿蒙原生应用数量已突破4000款&#xff0c;生态设备数量超过8亿台&#xff0c;开发者群体壮大至220万人。更为显著的是&#xff0c;鸿蒙系统在中国市场的份额已经超过了15%&#xff0c;稳居第三大操作系统&#xff0c;其生态之树已然枝繁…

人工智能时代,大模型如何崛起?

在人工智能时代&#xff0c;大模型的崛起可以归因于以下几个关键因素&#xff1a; 首先&#xff0c;强大的计算能力是基础。随着硬件技术的不断进步&#xff0c;如高性能的 GPU 集群等&#xff0c;能够为训练大模型提供足够的算力支持&#xff0c;使得大规模数据的处理和复杂模…

探秘机器学习经典:K-近邻算法(KNN)全解析

在浩瀚的机器学习宇宙中,K-近邻算法(K-Nearest Neighbors,简称KNN)如同一颗璀璨的明星,以其简洁直观的原理和广泛的应用范围,赢得了众多数据科学家的喜爱。今天,让我们一起揭开KNN的神秘面纱,深入探讨它的运作机制、优缺点、应用场景,以及如何在实际项目中灵活运用。 …

23. 【Java教程】接口

本小节我们将学习 Java 接口&#xff08;interface&#xff09;&#xff0c;通过本小节的学习&#xff0c;你将了解到什么是接口、为什么需要接口、如何定义和实现接口&#xff0c;以及接口的特点等内容。最后我们也将对比抽象类和接口的区别。 1. 概念 Java 接口是一系列方法的…

PostgreSQL事务基础理解

PostgreSQL事务 事务是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。数据库事务通常包含一个序列对数据库的读和写操作&#xff0c;主要是包含以下两个目的&#xff1a; 为数据库操作序列提供一个从失败中恢复到正常状态的方法&#…

事务管理控制

文章目录 1. 事务的基本概念2. 数据库的并发控制2.1 事务调度2.2 并发操作带来的问题2.3 并发调度的可串行性2.4 并发控制技术2.5 两段锁协议2.6 多粒度封锁协议 3. 数据库的备份与恢复3.1 数据库系统故障3.2 数据库的备份3.3 数据库的恢复 4. 数据库的安全性与完整性4.1 数据库…