共享模型之管程(八)

news2025/2/28 2:48:09

1.线程的活跃性

1>.定义:

线程内的有限代码因为某种原因一直无法执行完毕(/执行不完);

1.1.线程活跃性的现象-死锁

1>.有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁;

2>.案例

①.t1线程已经获得A对象锁,接下来想获取B对象的锁;
②.t2线程已经获得B对象锁,接下来想获取A对象的锁;

@Slf4j
public class TestDeathLock {
    //两个对象,对应两把锁
    final static Object A = new Object();
    final static Object B = new Object();

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            synchronized (A) {
                log.info("已经获取了lock A");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (B) {
                    //由于对象锁B当前是被线程t2占用,且并没有释放,那么线程t1获取锁失败进入EntryList中等待
                    log.info("再获取lock B");
                    log.info("操作...");
                }
            }
        }, "t1");

        Thread t2 = new Thread(() -> {
            synchronized (B) {
                log.info("已经获取了lock B");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (A) {
                    //由于对象锁A当前是被线程t1占用,且并没有释放,那么线程t2获取锁失败进入EntryList中等待
                    log.info("再获取lock A");
                    log.info("操作...");
                }
            }
        }, "t2");

        t1.start();
        t2.start();
    }
}

在这里插入图片描述
3>.定位死锁
检测死锁可以使用jconsole工具,或者使用jps定位进程id,再用jstack定位死锁,如:
在这里插入图片描述
在这里插入图片描述
4>.如何避免死锁?

①.避免死锁要注意加锁顺序;

②.另外如果由于某个线程进入了死循环,导致其它线程一直等待,对于这种情况linux下可以通过top先定位到CPU占用高的Java进程,再利用"top -Hp 进程id"来定位是哪个线程,最后再用jstack 排查;

5>.使用顺序加锁的方式解决之前的死锁问题
①.分析
在这里插入图片描述
②.解决方案:
在这里插入图片描述
***注意:该方式容易出现饥饿问题,即某个线程可能一直都获取不到锁资源!

1.2.线程活跃性的现象–活锁

1>.活锁: 两个线程互相改变对方的结束条件,最后谁也无法结束(一直在运行);

2>.案例:

@Slf4j
public class TestLiveLock {
    //共享变量
    static volatile int count = 10;
    //对象锁
    static final Object lock = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            // 期望减到 0 退出循环
            while (count > 0) {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                count--;
                log.info("count: {}", count);
            }
        }, "t1").start();


        new Thread(() -> {
            // 期望超过 20 退出循环
            while (count < 20) {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                count++;
                log.info("count: {}", count);
            }
        }, "t2").start();
    }
}

在这里插入图片描述
3>.如何避免活锁?

①.保证多个线程的执行时间有一定的间隔(交错),例如增加一些随机的睡眠时间;

1.3.线程活跃性的现象–饥饿

1>.定义: 一个线程由于优先级太低,始终得不到 CPU 调度执行,也不能够结束;

饥饿的情况不易演示,后续在读写锁相关的文章中会涉及饥饿问题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/161524.html

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

相关文章

Python和MySQL对比(4):用Pandas 实现MySQL的行列转换语法效果

文章目录一、前言二、语法对比数据表concat&#xff08;多列合并为一列&#xff09;group_concat&#xff08;多行合并为一行&#xff09;一列拆分为多列一行拆分为多行多行转为多列多列转为多行三、小结一、前言 环境&#xff1a; windows11 64位 Python3.9 MySQL8 pandas1.4.…

【Linux】make/Makefile的简单使用

人生的态度是&#xff0c;抱最大的希望&#xff0c;尽最大的努力&#xff0c;做最坏的打算。 – 柏拉图 《理想国》 目录一.Linux项目自动化构建工具-make/Makefile1.为什么需要使用make/Makefile2.简单理解make和Makefile3.如何编写Makefile文件3.1生成可执行程序&#xff1a…

智算中心掀落地热潮,加速AI普惠化

11日&#xff0c;国家信息中心与浪潮信息联合发布的《智能计算中心创新发展指南》显示&#xff0c;目前全国有超过30个城市正在建设或提出建设智算中心&#xff0c;“十四五”期间&#xff0c;对智算中心的投资可带动人工智能核心产业增长约2.9-3.4倍。 《科创板日报》记者注意…

python+人脸识别+opencv实现真实人脸驱动的阿凡达(中)

目录一、前言二、消除图片拼接缝隙三、基于一张图片正脸转侧脸的实现1、人体头部的二维成像知识2、用特征点驱动的方法实现侧脸2.1python核心代码三、后续工作一、前言 我们在上篇名叫python人脸识别opencv实现真实人脸驱动的阿凡达&#xff08;上博文里已经实现了基于三角映射…

教资报名啦 有问题欢迎评论区提问~

报考小tips&#xff1a; ①一次选报你所有准备报考的学科 ②看好类别&#xff0c;有些是“音体美专业”专属 ③审核前如果发现有漏报的科目&#xff0c;可以先取消再报 ④一旦审核通过&#xff0c;就不能更改/增加/较少报考科目 ⑤缴费成功后&#xff0c;不退费【如果考试前几天…

德云社、本山传媒齐聚辽宁卫视春晚,郭德纲和本山大叔会参加吗

腊月二十九&#xff0c;屋里走。不得不说辽宁卫视会选时间&#xff0c;兔年的春晚定在了农历腊月二十九这一天。备受关注的辽宁卫视春晚&#xff0c;准备在农历的腊月二十九晚上七点三十分&#xff0c;正式与广大观众见面。 辽宁卫视春晚之所以倍受期待&#xff0c;是因为这些年…

【MySQL】深入理解MySQL事务(上篇)

MySQL事务前言事务的ACID 特性事务提交方式事务常见操作方式正常演示 - 证明事务的开始与回滚非正常演示1 - 证明未commit&#xff0c;客户端崩溃&#xff0c;MySQL自动会回滚&#xff08;隔离级别设置为读未提交&#xff09;非正常演示2 - 证明commit了&#xff0c;客户端崩溃…

2021年大数据挑战赛A题智能运维中的异常检测与趋势预测求解全过程论文及程序

2021年大数据挑战赛 A题 智能运维中的异常检测与趋势预测 原题再现&#xff1a; 异常检测&#xff08;异常诊断/发现&#xff09;、异常预测、趋势预测&#xff0c;是智能运维中首当其冲需要解决的问题。这类问题是通过业务、系统、产品直接关联的 KPI 业务指标进行分析诊断&…

【Linux】生产者消费者

生产者消费者 生产者消费者问题概述 生产者/消费者问题&#xff0c;也被称作有限缓冲问题。可以描述为&#xff1a;两个或者更多的线程共享同一个缓冲 区&#xff0c;其中一个或多个线程作为“生产者”会不断地向缓冲区中添加数据&#xff0c;另一个或者多个线程作为“消费者”…

优先级队列--堆的应用(堆排序与TopK问题)

堆排序&#xff1a;比较方式为小于建大堆 priority_queue(Iterator first, Iterator last): _con(first, last) // 1、使用vector的区间构造函数来初始化_con{// 2、建堆&#xff1a;从完全二叉树的最后一个非叶子结点来进行向下调整for (int i (size() - 2) / 2; i > 0; i…

2023真无线蓝牙耳机怎么选?值得入手的蓝牙耳机推荐

蓝牙耳机作为近几年备受人们欢迎的数码产品&#xff0c;很多人都想买到一款适合自己的蓝牙耳机。但&#xff0c;随着蓝牙耳机的快速发展&#xff0c;蓝牙耳机市场充斥着各种机型&#xff0c;它们有着不同的性能、价格、外观等。所以&#xff0c;不少人都有一个疑惑&#xff0c;…

玩转 MySQL Shell 沙盒实例

什么是沙盒实例&#xff1f; 沙盒实例仅适用于出于测试目的在本地计算机上部署和运行&#xff0c;可以与 InnoDB Cluster 、 InnoDB ClusterSet 和 InnoDB ReplicaSet 一起工作。 如何使用部署沙盒的 API 函数&#xff1f; 语法dba.deploySandboxInstance(port[, options])解…

Mybatis学习笔记(一)

什么是框架&#xff1f; 它是我们软件开发中的一套解决方案&#xff0c;不同的框架解决的是不同的问题使用框架的好处&#xff1a;框架封装了很多的细节&#xff0c;使开发者可以使用极简的方式实现功能&#xff0c;大大提高开发效率 三层架构 表现层&#xff1a;用于展示数…

慕尼黑工业大学开源含四季的数据集:用于自动驾驶的视觉长期定位

以下内容来自[从零开始机器人SLAM知识星球] 每日更新内容 点击领取学习资料 → 机器人SLAM学习资料大礼包 #论文# #开源数据集# 4Seasons: Benchmarking Visual SLAM and Long-Term Localization for Autonomous Driving in Challenging Conditions 地址&#xff1a;https:/…

LeetCode[295]数据流的中位数

难度:困难题目&#xff1a;中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。描述&#xff1a;实现 MedianFinder 类:…

工信部及多地政府联合阿里健康在全国展开防疫保供专项行动

为了切实服务好百姓的购药需求&#xff0c;在工信部和各地政府的指导下&#xff0c;12月疫情政策调整以来&#xff0c;阿里健康已先后在全国20多个省市及地区配合药品物资精准投放工作&#xff0c;为各地居民重点供退热药、N95口罩等紧缺药品和物资&#xff0c;尽全力打好药品保…

Android系统定制开发过程快速查找定位分析代码的方法

推荐阅读 ​Android系统开发过程快速查找定位代码的方法 Android10以上系统定制Root权限(隐藏Root权限) 商务合作 2023年招聘 2023年逆向分析资料汇总 Android系统开发过程&#xff0c;经常需要进行文件查找、代码查找&#xff0c;常用find和grep查找命令 1.find命令 根据文…

短短六年时间冲到二奢品类第一,妃鱼如何做到的?

随着消费需求不断增长&#xff0c;二手奢侈品市场近五年来快速向规模化、平台化发展&#xff0c;妃鱼、红布林、胖虎等二奢电商品牌迅速崛起&#xff0c;成为风头劲胜的网红。国泰君安研究报告显示&#xff0c;中国闲置高端消费品零售市场规模已从2016年162亿元增长至2020年的5…

Vue js混淆加密 webpack-obfuscator

公司要求加密混淆js 之前 是用的glifyjs-webpack-plugin ,感觉不行。 然后使用了webpack-obfuscator 非常nice~&#xff0c;除了打包出来体积会有点大&#xff0c;浏览的网页会变慢&#xff0c;选择最低是就还好&#xff0c; 有多个条件属性可以选择&#xff0c; 可以选择高度混…

networkx学习(三) 随机网络

networkx学习(三) 随机网络 1.规则网络 2.随机网络的生成算法 第一种:G(N,L) import random import itertoolsdef GNL(N, L):G = nx.Graph()G.