【Java】集合概念及多线程

HashSet 、 LinkedHashSet 和 TreeSet 的主要区别在于底层数据结构不同。

HashSet 的底层数据结构是哈希表(基于 HashMap 实现)。

LinkedHashSet 的底层数据结构是链表和哈希表,元素的插⼊和取出顺序满⾜ FIFO。

TreeSet 底层数据结构是红⿊树,元素是有序的。

多线程的使用

  1. 继承Thread类 (可以说是 将任务和线程合并在一起)
  2. 实现Runnable接口 (可以说是 将任务和线程分开了)
  3. 实现Callable接口 (利用FutureTask执行任务)
继承Thread类

//继承Thread实现多线程
class Thread1 extends Thread{  
    private String name;  
    public Thread1(String name) {  
       this.name=name;  
    }  
    public void run() {  
        for (int i = 0; i < 5; i++) {  
            System.out.println(name + "运行  :  " + i);  
            try {  
                sleep((int) Math.random() * 10);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
         
    }  
}  
public class Main {  
  
    public static void main(String[] args) {  
        Thread1 mTh1=new Thread1("A");  
        Thread1 mTh2=new Thread1("B");  
        mTh1.start();  
        mTh2.start();  
  
    }  
}  
 

上面这个两个类,Thread1类继承了Thread父类,并重写了里面的run方法。实现了多线程里面的方法,并在main函数中进行实例化了两个mTh1,mTh2两个线程。

线程的⽣命周期和状态

NEW: 初始状态,线程被创建出来但没有被调⽤

RUNNABLE: 运⾏状态,线程被调⽤了 start() 。 start() 等待运⾏的状态。

BLOCKED :阻塞状态,需要等待锁释放。

WAITING:等待状态,表示该线程需要等待其他线程做出⼀些特定动作(通知或中断)。 TIME_WAITING:超时等待状态,可以在指定的时间后⾃⾏返回⽽不是像 WAITING 那样⼀直等 待。

TERMINATED:终⽌状态,表示该线程已经运⾏完毕

避免死锁的方法

1、银行家算法

银行家算法是一种死锁避免的算法,它的设计灵感来自于银行业的贷款和存款模型。在银行家算法中,系统被视为一个银行,进程被视为银行的客户,而资源则被视为银行的资金。这个类比帮助理解了资源的分配和使用过程,以及系统如何避免死锁的发生。

关系:

  1. 资源分配类比: 在银行家算法中,系统中的资源被视为银行的资金或贷款,进程对资源的请求则类比为客户对银行的贷款请求。

  2. 资源请求和释放: 进程在执行过程中会请求资源,就像客户向银行申请贷款一样。当进程完成任务后,会释放已经使用的资源,类似于客户还清贷款后归还资金给银行。

  3. 安全性检查: 银行家算法通过模拟系统资源分配的过程来检查系统是否处于安全状态,即是否存在一种资源分配顺序,使得所有进程都能完成并释放资源,类似于银行在进行贷款审批前的风险评估。

  4. 资源足够性: 银行家算法要求在分配资源时,系统必须确保分配后还有足够的资源供其他进程使用,类似于银行在进行贷款审批时需要确保自身还有足够的资金供其他客户使用,以避免银行出现资金短缺的情况。

2、时间戳算法(Timestamp-based Algorithms)

 时间戳算法基于全局的时间戳来分配资源和管理进程的请求。每个进程和资源都有一个唯一的时间戳,系统根据时间戳的顺序来决定资源的分配和进程的执行顺序。这种算法可以避免死锁,但可能会增加系统的开销。

Java虚拟机(JVM)的垃圾回收机制是指在Java程序运行过程中,自动识别并回收不再被程序使用的内存空间的过程。Java语言中的垃圾回收机制是一种自动化的内存管理方式,开发者不需要显式地去释放内存,而是由JVM自动管理。以下是JVM垃圾回收机制的一般原理和常见的回收算法:

原理:

  1. 对象生命周期管理: Java中的对象在被创建后,会被JVM自动跟踪管理其生命周期。当对象不再被引用时,它会变得不可达(即没有任何引用指向它),成为垃圾。

  2. 垃圾识别: 垃圾回收器负责识别不再被引用的对象,并将其标记为垃圾。

  3. 垃圾回收: JVM中的垃圾回收器会定期或在内存达到一定阈值时,自动回收被标记为垃圾的对象所占用的内存空间,将其释放出来供后续的对象使用。

垃圾回收算法:

  1. 标记-清除算法(Mark and Sweep): 首先标记所有活跃对象,然后清除所有未标记的对象,释放它们所占用的内存空间。这种算法会产生内存碎片,可能导致内存碎片化。

  2. 复制算法(Copying): 将内存空间分为两个区域,一半用于存放对象,另一半保持空闲。当一个区域被占满后,将存活的对象复制到另一个区域,并清除原区域中的所有对象。这种算法解决了内存碎片化的问题,但会浪费一部分内存空间。

  3. 标记-整理算法(Mark and Compact): 结合了标记-清除和复制算法的优点。首先标记活跃对象,然后将活跃对象向一端移动,之后清理出空闲内存。这种算法避免了内存碎片化,并减少了内存移动的次数。

  4. 分代回收算法(Generational Garbage Collection): 将堆内存分为不同的代(Generation),一般分为新生代(Young Generation)和老年代(Old Generation)。新生代中的对象生命周期短,老年代中的对象生命周期长。根据代的特性采用不同的垃圾回收算法和策略。

  1. 数据一致性: 在分布式环境中,各个节点的计算结果需要合并以得到全局的最优解。如果多个节点在没有同步的情况下同时修改共享状态,可能会导致最终的结果不一致。通过使用锁来控制对共享状态的访问,可以确保数据的一致性。

  2. 部分计算依赖: 在一些情况下,某些节点的计算结果可能依赖于其他节点的计算结果。使用锁可以确保节点之间的计算顺序,保证依赖关系的正确性。

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

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

相关文章

node之初始化一个环境

react Remix Docs 指定 npm 的全局安装目录 在 npm 中&#xff0c;你可以使用 prefix 命令来指定全局安装的目录路径。以下是如何进行设置的步骤&#xff1a; 打开命令提示符或终端。 运行以下命令&#xff0c;将全局安装目录设置为你想要的路径&#xff08;例如&#xff0…

Linux系统下使用Parted调整物理分区大小

前言 在管理Linux系统时&#xff0c;有时需要对物理分区大小进行调整以满足不断变化的需求。Parted是一款功能强大的分区管理工具&#xff0c;可以帮助您轻松地进行这项任务。本文将简要介绍如何使用Parted来调整物理分区大小&#xff0c;让您能够快速且安全地完成这一操作。 …

【前端】4. CSS综合案例

1. 模拟新闻界面 <!-- 1.模拟实现新闻界面 --><!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

C++中对象的析构函数的调用

什么情况下析构函数会自动调用 对象的生命周期结束时&#xff0c;会自动调用析构函数。在 C 中&#xff0c;对象的生命周期通常由其作用域来管理。当对象超出其作用域时&#xff0c;编译器会自动调用对象的析构函数来释放资源。这适用于以下几种情况&#xff1a; 对象在函数内…

YMP实现Oracle迁移到YashanDB

迁移需求 ip地址 数据库信息 操作系统信息 源库 192.168.3.132 实例名topdh 用户密码TOPICIS/oracle 端口1521 Centos7.9 x86_64 目标库 192.168.3.175 实例名yasdb 用户密码topicist/opicis 端口1688 Centos7.9 x86_64 迁移前准备 YMP工具获取 根据实际需求向厂…

sky12笔记

ROM (read only memory)的初始值用系统函数 r e a d m e m b / readmemb/ readmemb/readmemh把文件读进来 parameter READ_PATH "../rtl/lut.mif"; initial begin$readmemb(READ_PATH ,mem); endalways组合逻辑常见错误 1.敏感列表变量不全&#xff0c;会导致RTL s…

Java 文件上传,下载,复制,删除,Zip文件解压缩,文件内容修改,JSON 文件中字段值的修改,递归删除文件夹及其子文件等

Java 文件上传&#xff0c;下载&#xff0c;复制&#xff0c;删除&#xff0c;Zip文件解压缩&#xff0c;文件内容修改&#xff0c;JSON 文件中字段值的修改&#xff0c;递归删除文件夹及其子文件等 ControllerFileUtil Controller 文件批量上传批量删除文件文件下载 import …

sklearn【AUC-ROC】原理,以及绘制ROC曲线!

一、AUC-ROC 介绍 在分类任务中&#xff0c;特别是当数据集中的类别分布不平衡时&#xff0c;评估模型的性能变得尤为重要。AUC-ROC&#xff08;Area Under the Receiver Operating Characteristic Curve&#xff0c;受试者工作特征曲线下的面积&#xff09;是一种有效的评估指…

Vue3:组合式API的基本使用

一、前言 本文主要讲述在Vue3中组合式API的基本使用。 二、组合式API的写法 1、数据 组合式API中&#xff0c;数据在setup函数里面声明数据要在return中返回才能在模板中渲染使用如果数据类型不是响应式数据&#xff0c;当数据改变时&#xff0c;已经展示在页面上的数据不会…

S32 Design Studio PE工具配置Power_Manager

工具配置 基本就是默认配置就行&#xff0c;就是在这6个状态里面跳转&#xff0c;重点就是前面2个状态.这个是芯片的电源管理&#xff0c;跟产品的电源管理是两回事。 生成代码 在Generated_Code/pwrMan1.c 里面&#xff0c;对应刚才配置的信息&#xff0c;一共有6个状态。 …

ChatGPT在论文写作中的应用:提升表达与逻辑的双重助力

随着人工智能技术的快速发展&#xff0c;其在科研领域的应用也愈发广泛。AI不仅提升了科研创新的效率&#xff0c;还为科研人员带来了前所未有的便利。本文将从ChatGPT深度科研应用、数据分析及机器学习、AI绘图以及高效论文撰写等方面&#xff0c;综述AI如何助力科研创新与效率…

土壤水分检测仪中应用的数字电容传感芯片

土壤水分检测仪&#xff0c;它是基于频域反射&#xff08;Frequency Domain Reflectometry&#xff0c;FDR&#xff09;原理&#xff0c;能够准确对传感器周围的土壤水分情况进行监测,可对10cm、20cm、30cm、40cm、50cm的较多5个监测层面进行测量。广泛应用于农田蒸散、作物耗水…

【话题】程序员如何搞副业,简单探讨下

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景前提条件打造私域广结朋友平台 技能转化为价值1. 副业途径2. 如何开展3. 未来趋势与建议4. 挑战与策略5. 规划与发展 文章推荐 背景 程序员不仅拥有将抽象概念转化…

文献速递:深度学习胶质瘤诊断---使用深度学习在 MRI 图像中进行低级别胶质瘤的脑肿瘤分割和分级

Title 题目 Brain tumor segmentation and grading of lower-grade glioma using deeplearning in MRI images 使用深度学习在 MRI 图像中进行低级别胶质瘤的脑肿瘤分割和分级 01文献速递介绍 胶质瘤是最常见的脑肿瘤&#xff0c;根据肿瘤的恶性程度和生长速率具有不同的分级…

婴儿用的洗衣机买哪种好?四款超实用高质量婴儿洗衣机推荐!

近几年科技高速发展&#xff0c;我们的生活也因此变得更加便捷、健康高效。尤其是在家庭生活中&#xff0c;各种新兴家电的出现让我们的生活变得更加健康卫生。婴儿洗衣机也为现代家庭提供了极大的便捷。由于婴儿刚出生免疫力比较弱&#xff0c;所以建议婴儿的衣物尽量和大人的…

操作系统命令(贪吃蛇项目)

&#x1f3dd;1.获得句柄 GetStdHandle是⼀个Windows API函数。它用于从⼀个特定的标准设备&#xff08;标准输入、标准输出或标 准错误&#xff09;中取得⼀个句柄&#xff08;用来标识不同设备的数值&#xff09;&#xff0c;使用这个句柄可以操作设备。 ⛳️函数原型&…

多线程(60)SynchronousQueue和它的用途

SynchronousQueue是一个没有存储空间的阻塞队列&#xff0c;它是java.util.concurrent包中的一部分。每一个put操作必须等待一个take操作&#xff0c;反之亦然。SynchronousQueue内部并不维护任何元素的存储&#xff0c;可以认为它是一种线程之间一对一传递消息的机制。 核心特…

ArrayList的并集、交集、差集

并集&#xff1a; //并集操作&#xff1a;将另一个容器中的元素添加到当前容器中List<String> a new ArrayList<>(); a.add("a"); a.add("b"); a.add("c");List<String> b new ArrayList<>(); b.add("a");…

MySQL出现Waiting for table metadata lock的原因方法

MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景。而且,一旦alter table TableA的操作停滞在Waiting for table metadata lock的状态,后续对TableA的任何操作(包括读)都无法进行,因为他们也会在Opening tables的阶段进入到Waiti…

力扣:219. 存在重复元素 II

力扣&#xff1a;219. 存在重复元素 II 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …