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

news2024/10/6 8:40:18

                —— 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 {
            // 套件锁A
            synchronized (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.coloradmin.cn/o/1688527.html

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

相关文章

SQL刷题笔记day2

1 题目 我的通过代码: select salary from salaries group by salary order by salary desc 复盘:考点是只显示一次——group by,逆序(从大到小)——order by...desc 2题目 我的错误代码: select empl…

【stm32/CubeMX、HAL库】嵌入式实验六:定时器(3)|外部脉冲计数

参考: 【【正点原子】手把手教你学STM32CubeIDE开发】 https://www.bilibili.com/video/BV1Wp42127Cx/?p13&share_sourcecopy_web&vd_source9332b8fc5ea8d349a54c3989f6189fd3 《嵌入式系统基础与实践》刘黎明等编著,第九章定时器&#xff0c…

若依微服务整合knife4j

在Spring Cloud的微服务架构下&#xff0c;每个微服务并不需要引入前端的ui资源&#xff0c;因此在每个微服务的Spring Boot项目下&#xff0c;引入ruoyi-common-swagger提供的starter即可。 1、在ruoyi-gateway网关模块下&#xff0c;把knife4j依赖资源引入 <!-- knife4j…

数据结构之时间复杂度和空间复杂度的相关计算

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 时间复杂度 概念 大O的渐进表示法 相关练习 例1&#xff1a; 例2&#xff1a; 例3&am…

Redis篇 Redis的基本命令和Keys命令

get,set命令和Keys命令 一. get,set命令二. keys命令1.?2. *3. [^]4.[] 一. get,set命令 在博主给大家说明这两个最核心的命令之前,还需要大家知道, Redis的客户端和服务器交互,需要非常非常多的命令 但是大家需要全记住吗? 大家只需要记住基本命令.并且会查询其他命令即可. …

http项目改为/支持https的方案、无需修改后台代码

背景描述&#xff1a;原来的项目前后台都是http&#xff0c;现在某个服务要求前台必须使用https&#xff1b; 方案1&#xff1a;前台部署在https里&#xff0c;后面代码修改&#xff1b;但是微服务架构&#xff0c;后台工作量太大&#xff1b; 方案2&#xff1a;前台部署在ht…

PySODEvalToolkit 使用笔记

1. 克隆仓库 首先&#xff0c;克隆PySODEvalToolkit仓库到你的本地机器&#xff1a; git clone https://github.com/lartpang/PySODEvalToolkit.git2. 创建虚拟环境 cd PySODEvalToolkit conda create -n pysodeval python3.73. 安装依赖 pip install -r requirements.txt4…

文心一言 VS 讯飞星火 VS chatgpt (266)-- 算法导论20.2 1题

一、写出 PROTO-vEB-MAXIMUM 和 PROTO-vEB-PREDECESSOR 过程的伪代码。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 首先&#xff0c;让我们明确一下 PROTO-vEB-MAXIMUM 和 PROTO-vEB-PREDECESSOR 这两个过程是在介绍van Emde Boas树&#xff08;简称vEB树&a…

Vue - JavaScript基础学习

一、语言概述 JavaScript 中的类型应该包括这些&#xff1a; 1.数字&#xff08;默认双精度区别于Java&#xff09; console.log(3 / 2); // 1.5,not 1 console.log(Math.floor(3 / 2)); // 10.1 0.2 0.30000000000000004NaN&#xff08;Not a Number&#x…

深入用户内心:设计师如何通过可用性测试洞察用户需求

可用性测试是指让用户体验产品的原型或成品。设计师通过观察和分析用户的使用行为和感受&#xff0c;进一步合理地改进产品的设计方法。你可能会想知道我们可以用什么方法来测试可用性&#xff1f;随着互联网行业的快速迭代更新&#xff0c;可用性测试衍生出了许多类型和方法。…

Packet Tracer-HSRP+DHCPv4+VLAN间路由+以太通道综合实验

实验拓扑&#xff1a; 实验内容&#xff1a; VLAN及VLAN间路由的配置&#xff0c;以太通道的配置&#xff0c;STP的根调整&#xff0c;DHCPv4的配置&#xff0c;首跳冗余HSRP的配置。 实验最终结果&#xff1a; PC可以自动获取到DHCP-Server分配的IP地址&#xff0c;实现首跳…

【人工智能】模型性能评估

模型性能衡量介绍 混淆矩阵 混淆矩阵(Confusion Matrix&#xff09; TP(真阳性)&#xff1a;预测为阳性&#xff0c;且预测正确。 TN(真阴性)&#xff1a;预测为阴性&#xff0c;且预测正确。 FP(伪阳性)&#xff1a;预测为阳性&#xff0c;但预测错误&#xff0c;又称型一误…

widedeep模型简介

wide&deep模型 1.简介2.原理2.1 网络结构 3. 稀疏密集特征4.API和子类方式实现 1.简介 Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右发布的一类用于分类和回归的模型&#xff0c;并应用到了 Google Play 的应用推荐中。wide and deep 模型的核心思想是结合线性模…

VBA_MF系列技术资料1-615

MF系列VBA技术资料1-615 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-0…

Ubuntu切换内核版本

#安装内核安装工具 sudo apt-get install software-properties-common sudo add-apt-repository ppa:cappelikan/ppa sudo apt-get update sudo apt-get install mainline#安装指定内核版本(有些版本并不能安装成功) mainline install 5.14.10#更新GRUB配置 sudo update-grub#查…

go mod模式下,import gitlab中的项目

背景 为了go项目能够尽可能复用代码&#xff0c;把一些公用的工具类&#xff0c;公用的方法等放到共用包里统一管理。把共用包放到gitlab的私有仓库中。 遇到的问题 通过https方式&#xff0c;执行go get报了错误。 通过ssh方式&#xff0c;执行go get报了错误。 修改配置&am…

Joomla 3.7.0 (CVE-2017-8917) SQL注入漏洞环境

1 漏洞概述 Joomla是一个基于PHP的内容管理系统&#xff08;CMS&#xff09;&#xff0c;广泛应用于各类网站。2017年&#xff0c;Joomla 3.7.0版本被发现存在SQL注入漏洞&#xff08;CVE-2017-8917&#xff09;&#xff0c;攻击者可以利用该漏洞对数据库进行未授权查询或操作…

副业树洞聊天项目/树洞倾诉/陪陪系统源码/树洞源码下载搭建

随着社会的发展和人们生活水平的提高&#xff0c;越来越多的人在面临心理压力、情感困扰或生活困境时&#xff0c;需要一个可以宣泄、倾诉和寻求支持的平台。而传统的人际交往方式往往会遇到难以排解的问题&#xff0c;比如担心被他人知晓自己的隐私等&#xff0c;这就导致了人…

鸿蒙系统和安卓系统通过termux搭建Linux系统—Centos

目录 1. 前言 2. 效果图展示 3. 安装termux 4. 安装Centos系统 4.1 更换源 4.2 拉取镜像 4.3 启动centos 5.结尾 1. 前言 大家好&#xff0c;我是jiaoxingk 今天这篇文章让你能够在手机或者平板上使用Linux-Centos系统 让你随时随地都能操作命令行进行装13 2. 效果图展示…

【科普知识】伺服电机中的内置制动器

在工业自动化和机器人技术快速发展的今天&#xff0c;伺服电机作为核心驱动元件&#xff0c;其性能与功能直接影响整个系统的运行效率与稳定性。 近年来&#xff0c;一体化伺服电机技术不断融合创新&#xff0c;并逐步加入了许多新的硬件和软件的功能&#xff0c;为工业自动化领…