线程活跃性

news2024/11/27 20:25:01

文章目录

    • 1. 简介
    • 2. 死锁
    • 3. 活锁
    • 4. 饥饿

1. 简介

所谓线程的活跃性,我们知道每个线程所要执行的java代码是有限的,在执行一段时间后线程自然会陷入Terminated状态,但由于某些外部原因导致线程一直执行不完,一直处于活跃状态,这就是所谓的线程的活跃性。下面一一介绍导致线程活跃性的情况:

2. 死锁

有这么一种情况,一个线程同时获取多把锁,这时就容易发生死锁:

t1线程获得A对象锁,接下来想获取B对象的锁,t2线程获取B对象的锁,而想要获得A对象的锁。这就是一种死锁情况。

如下面代码就模拟了死锁的情况


@Slf4j
public class Hello{
	
	public static void main(String[] args){
	    test();
	}

	public static void test(){
		Object A=new Object();
		Object B=new Object();
		new Thread(()->{
			synchronized (A){
				try {
					Thread.sleep(1000);
					log.debug("我已经有了锁A,现在想获取锁B");
					synchronized (B){
						log.debug("我已经有了锁A,且获取了锁B");
					}
				} catch (InterruptedException e) {
					throw new RuntimeException(e);
				}
			}
		},"线程1").start();
		new Thread(()->{
			synchronized (B){
				try {
					Thread.sleep(1000);
					log.debug("我已经有了锁B,现在想获取锁A");
					synchronized (A){
						log.debug("我已经有了锁B,且获取了锁A");
					}
				} catch (InterruptedException e) {
					throw new RuntimeException(e);
				}
			}
		},"线程2").start();
	}
}

发生了死锁我们此时就可以使用死锁一些工具来定位到死锁发生的地方。检测死锁可以使用jconsole工具,或者使用.jps定位进程id,再用jstack定位死锁。

  1. 获取进程ID

在这里插入图片描述

  1. 查看线程状态
jstack 1757

可以发现已经出现了死锁信息

在这里插入图片描述
在这里插入图片描述

我们同样可以使用jconsole

jconsole

在这里插入图片描述

在死锁中有一个著名的问题叫做哲学家就餐问题:

在这里插入图片描述
当五个哲学家都拿一根筷子就出现了死锁问题。

筷子类:

final class Chopsticks{
     String name;
	 public chopsticks(String name){
		 this.name=name;
	 }

	@Override
	public String toString() {
		return "chopsticks{" +
				"name='" + name + '\'' +
				'}';
	}
}

哲学家类:

@Slf4j
final class Philosopher extends Thread{
	Chopsticks left;
	Chopsticks right;

	@Override
	public void run() {
		while(true){
			synchronized (left){
				synchronized (right){
					try {
						eat();
					} catch (InterruptedException e) {
						throw new RuntimeException(e);
					}
				}
			}
		}
	}

	public void eat() throws InterruptedException {
		log.debug("两只筷子都有了,开始吃了");
		Thread.sleep(1000);
	}
	public Philosopher(Chopsticks left, Chopsticks right,String name){
		super(name);
		this.left=left;;
		this.right=right;


	}

}

测试代码:

@Slf4j
public class Hello{
	
	public static void main(String[] args){
         Chopsticks c1=new Chopsticks("筷子1");
		 Chopsticks c2=new Chopsticks("筷子2");
		 Chopsticks c3=new Chopsticks("筷子3");
		 Chopsticks c4=new Chopsticks("筷子4");
		 Chopsticks c5=new Chopsticks("筷子5");
		 new Philosopher(c1,c2,"哲学家1").start();
		 new Philosopher(c2,c3,"哲学家2").start();
		 new Philosopher(c3,c4,"哲学家3").start();
		 new Philosopher(c4,c5,"哲学家4").start();
		 new Philosopher(c5,c1,"哲学家5").start();
	}


}

jconsole检测死锁:

在这里插入图片描述
使用java地可重入锁可以解决该问题

3. 活锁

活锁出现在两个线程互相改变对方的结束条件,最后谁也无法结束的情况

@Slf4j
public class Hello{
	static volatile int count=10;
	static final Object lock=new Object();
	public static void main(String[] args){
		new Thread(()->{
			while(count>0){
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					throw new RuntimeException(e);
				}
				count--;
				log.debug("count:{}",count);
			}
		},"t1").start();
		new Thread(()->{
			while(count>0){
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					throw new RuntimeException(e);
				}
				count++;
				log.debug("count:{}",count);
			}
		},"t2").start();
	}
}

解决方法,让两个线程执行错开

4. 饥饿

饥饿指的是,一个线程由于优先级太低,始终得不到CPU的调度执行,也不能够结束。

在这里插入图片描述
回到上面哲学家问题,我们发现哲学家1-4都是顺序获取锁的,到哲学加5是先获取5再获取1,所以他不是按顺序获取的,这里我们改一下代码:

new Philosopher(c1,c5,"哲学家5").start();

在这里插入图片描述
此时就不会出现死锁了,但我们发现哲学家5一直没有获取锁,说明它发生了饥饿。

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

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

相关文章

Apache APISIX Dashboard 未经认证访问导致 RCE(CVE-2021-45232)漏洞复现

漏洞描述 Apache APISIX 是一个动态、实时、高性能的 API 网关,而 Apache APISIX Dashboard 是一个简单易用的前端界面,用于管理 Apache APISIX。 在 2.10.1 之前的 Apache APISIX Dashboard 中,Manager API 使用了两个框架,并在…

分享5款会带来意想不到效果的软件

​ 有时候一些小工具,能给你带来一些意想不到的效果,我们来看看下面这5款工具,你又用过其中几款呢? 1.密码管理器——Bitwarden ​ Bitwarden是一款开源的密码管理器,可以安全地生成、存储和分享密码和其他敏感信息。…

探索经典算法:贪心、分治、动态规划等

1.贪心算法 贪心算法是一种常见的算法范式,通常在解决最优化问题中使用。 贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法范式。其核心思想是选择每一步的最佳解决方案,以期望达到最终的全局最优解。这种算法特点在于只考虑局部最优解&am…

郑州市管城回族区政协副主席张惠云一行莅临中创算力调研指导工作

为促进企业健康发展,服务管城区企业。2023年11月8日,郑州市管城区政协副主席、工商联主席张惠云带队赴河南中创算力信息科技有限公司进行走访调研。 中创算力董事长许伟威、技术总监刘朝阳陪同考察。此次调研旨在深入了解中创算力的发展情况&#xff0c…

避坑丨一次看懂软著软件著作权登记避免「补正」的“方法”……

前言:2023年6月1日起,试运行软件版权登记网上办理。软件著作权申请登记,从提交到审核结束基本都得两个月以上。对很多企业来说,两个月的时间本来就长,但如果提交的材料不符合要求、不规范,大概率就会出现补…

将对象与返回的数据所对应的键相同时一一赋值

问题描述 对象与返回的数据直接赋值,会将多余的键与值也添加上 那么赋值时值要 目标对象的键所对应的值 解决方案: 利用双重遍历 来比对 当 键相同时再赋值 duiYingFuZhi(obj,data){for (let key in obj) {for (let index in data) {if (keyindex) {obj…

在线预约表单小程序源码系统 带完整搭建教程

随着移动互联网的普及和前端技术的不断发展,越来越多的业务场景开始采用在线预约表单小程序来实现。这种小程序具有使用便捷、用户体验良好、能够快速处理大量数据等优点。随着消费者对服务质量和体验的要求不断提高,传统的预约方式已经无法满足人们的需…

CAS200 CLS216 基于图形用户界面的快速应用程序开发

CAS200 CLS216 基于图形用户界面的快速应用程序开发 最新的Sapera Vision软件套件包括萨佩拉加工和新的星形胶质细胞铥人工智能(AI)的图形应用。该软件套件提供经过现场验证的图像处理和人工智能功能,用于设计、开发和部署高性能机器视觉应用。 这个最新版本的Sape…

【性能测试】Linux下Docker安装与docker-compose管理容器(超细整理)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、Linux下Docker…

在线CRM系统的安全性高吗?企业该如何选择?

在线CRM系统具备门槛低、功能不打折扣、部署周期短等优点,相比本地化部署更加适合中小企业。但很多企业在选型软件时会顾虑在线CRM系统的安全性高吗? 通常情况下厂商会比中小企业更有实力保证数据安全,从技术手段保护企业隐私不被盗用。 数…

JS加密/解密之你是否真的明白xss

摘要:跨站脚本攻击(XSS)是当前Web应用程序中最常见的安全威胁之一。本文通过综合分析XSS攻击的原理和特点,提出了一系列全面的防御策略,包括输入验证和过滤、输出编码以及Content Security Policy(CSP&…

C++/Qt 小知识记录4

工作中遇到的一些小问题,总结的小知识记录:C/Qt 小知识4 mysql导入*.sql文件提示连接超时等问题mysql局域网内访问VLC低版本的匹配QLineEdit的正则表达式限制获取windows下已加载磁盘盘符QLabel自动换行QElapsedTimer间隔计时自定义Class作为Key需要重载…

重生奇迹MU之地下城简介

当重生奇迹游戏中的玩家等级达到了十多级之后,不再满足于城外的简单刷怪时,此时可以去地下城冒险一番,除却冰风谷以外,地下城就是重生奇迹中玩家人数最多的地方,因为这里的怪物数量众多,而且时常会爆出一些…

mac 安装adb命令执行耗电测试

1、mac安装brew: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"2、mac brew 安装adb: brew install android-platform-tools adb --version adb devices 3、adb命令查询包…

Spark 读取ES采坑系列

目录 一、使用的插件 二、ES集群和Elasticsearch-hadoop版本问题 三、Elasticsearch-hadoop 和Scala版本以及Spark版本&#xff08;版本不匹配会有各种异常信息 一、使用的插件 <dependency><groupId>org.elasticsearch</groupId><artifactId>elas…

Java线程状态转换

从java层面&#xff0c;线程状态分为六种&#xff0c;分别是New、Blocked、Waiting、Timed_Waiting、Terminated和Runnable New&#xff1a;初始状态&#xff0c;线程刚刚创建还未调用start方法&#xff0c;线程还没有和操作系统的线程关联起来 New->Runnable(箭头1)&#…

IP代理识别API:预防欺诈和保护网络安全的必要工具

引言 随着互联网的快速发展&#xff0c;我们的生活变得越来越依赖于网络。然而&#xff0c;随着网络的发展&#xff0c;网络犯罪和网络欺诈也在不断增加。为了保护自己的网站和客户免受网络欺诈的侵害&#xff0c;许多企业和组织开始使用IP代理识别API作为一种必要工具。 什么…

ChatGPT和API发生重大中断!

11月9日凌晨&#xff0c;OpenAI在官网发布&#xff0c;ChatGPT和API发生重大中断&#xff0c;导致全球所有用户无法正常使用&#xff0c;宕机时间超过2小时。 目前&#xff0c;OpenAI已经找到问题所在并进行了修复&#xff0c;但仍然不稳定&#xff0c;会继续进行安全监控。 …

Python 中的 re.sub 如何使用?各参数都是什么意思?有什么要注意的?怎么在线验证正则?

讲解之前&#xff0c;我们先来看一下该方法的官方注释&#xff1a; 翻译过来的意思大概是&#xff1a; “返回通过将字符串中最左边、不重叠的模式出现替换为替代字符串 repl 后获得的字符串。repl 可以是一个字符串或一个可调用对象&#xff1b;如果是一个字符串&#xff0c…

蓝桥杯每日一题2023.11.9

包子凑数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 对于此题是一个简单DP的翻版问题&#xff0c;若能凑出当前的包子数&#xff0c;则凑出之前一定为dp[i - a[j]]&#xff0c;若表示出的dp[i]不是0则说明是一定存在数可以被凑出的&#xff0c;由题意&#xff1a;若凑不出的…