Java后端每日学点系列?线程知否,List懂否,垃圾回收器晓得否

简介: Java后端每日学点系列?线程知否,List懂否,垃圾回收器晓得否

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家

📌 擅长领域:全栈工程师、爬虫、ACM算法

💒 公众号:知识浅谈

🤞这次都给他拿下🤞

正菜来了⛳⛳⛳

🎈线程安全的定义?实现线程安全的方式有哪些?

线程安全:当多个线程访问同一资源的的时候,不需要考虑多个线程对同一资源的并发访问造成不正确的结果,不需要进行同步控制来达到线程安全。

实现线程安全的方式

  1. 加Synchronized锁,通过加锁来形成不会对同一资源并发操作的时候造成不正确的结果。
  2. 使用互斥变量,用户此变量达到一个同步的结果。
  3. 使用Lock锁机制,对线程不安全的代码块加lock锁。

🎈线程池理解吗?核心参数和执行流程?

温馨提醒:这个有点多,请仔细看下去

线程池:之所以存在线程池,是针对单独线程在管理上等不同的方面所体现出的优势。

  1. 减少资源消耗:因为单线程频繁的创建和销毁会消耗资源的,所以使用线程池可以把创建的线程存储起来,使用的时候直接分配,不用频繁的创建和销毁,减少了资源的消耗。
  2. 便于线程的管理:如果线程是一个一个去创建的,需要我们一个个去管理,当使用线程池的时候,就交给线程池管理了。
  3. 线程池的灵活性:我们可以根据业务手动的设置线程池的参数,来灵活的控制像是阻塞队列,以及核心线程数等这些参数。

线程池核心参数

kernel_size:核心线程数

max_size:最大线程数

blocking_queue:阻塞队列

keep_alive:非核心线程没有执行任务的时候存活的时间

Time_unit:存活时间的时间单位

Thread_factory:线程工厂

strategy: 策略

执行流程:

刚开始的时候线程池为空,任务来了之后查看是否有空闲的线程,有的话直接执行,没有的话查看线程池中的线程数是不是小于核心线程数,小于的话,创建线程并执行任务,如果不小于的话,查看阻塞队列是否已经满了,未满的话放入阻塞队列,满的话,查看线程池中的线程数是否小于最大线程数,小于的话,创建非核心线程执行任务,如果线程池中的线程数等于的话

,进行抛弃策略,包含四种策略:直接抛弃,抛弃并抛出异常,删除队列中时间最长的任务,并把当前任务加入队列,返回给调用线程池执行任务的线程执行。

🎈ArrayList和LinkedList的区别?

首先,两个都是java中的列表,但是其在不同的操作上效率不同,可根据不同的业务选用不同的列表类型。

从结构上:

  • ArrayList是以数组的形式存储数据的,便于查找指定位置的数据,但是在插入删除可能会比较慢,插入一个数据之后,该数据后边的数据都要向后移动一位,同样删除一个数据之后,该数据后边的数据都要向前移动一位。
  • LinkedList是以链表的形式存储数据的,便于增加删除数据,但是对于查找某一个位置的数据,需要进行遍历,从头遍历到指定的位置,然后返回。

从扩容上:

  • ArrayList是以数组的形式,初始的大小为10,当内存不够的时候以1.5倍的大小增加。
  • LinkedList是以链表的形式,通过数据的增加,长度也增加。

🎈说说G1和CMS的区别?优缺点等

G1:既是并发的又是并行的一种垃圾回收器,并行体现在年轻代的垃圾回收,不同的区域同时进行垃圾回收,并发体现在并发标记混合回收阶段,总共包含一下阶段:初始标记,根区域扫描,并发标记(删除区域内全为垃圾的区域),重新标记,独占清理(对不同区域垃圾占比进行排序),混合回收。

CMS:是一种并发的垃圾回收器,常用于老年代,使用的为标记清理方法,包含以下阶段:初始标记,并发标记,重新标记,并发清理,并发重置。

G1:

优点:在多CPU的环境下处理的效率比较高。

缺点:在多CPU和资源的条件下才能发挥出来优势,否则其效率就降低了。

CMS:

优点:因为并发标记和并发清理减少STW的时间,所以响应效率比较高

缺点:但是需要进行上下文的切换,也会有一定的资源消耗,在多cpu的环境比较能发挥CMS的性能。因为其标记清除的垃圾回收方法产生碎片,CMS处理器无法处理浮动垃圾。

🍚总结

以上就是关于三者的总结:线程知否,List懂否,垃圾回收器晓得否。

相关文章
|
1天前
|
缓存 Java 调度
Java并发编程:深入理解线程池
【4月更文挑战第30天】 在Java并发编程中,线程池是一种重要的工具,它可以帮助我们有效地管理线程,提高系统性能。本文将深入探讨Java线程池的工作原理,如何使用它,以及如何根据实际需求选择合适的线程池策略。
|
1天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】 本文将深入探讨Java中的线程池,解析其原理、使用场景以及如何合理地利用线程池提高程序性能。我们将从线程池的基本概念出发,介绍其内部工作机制,然后通过实例演示如何创建和使用线程池。最后,我们将讨论线程池的优缺点以及在实际应用中需要注意的问题。
|
1天前
|
设计模式 算法 安全
Java多线程编程实战:从入门到精通
【4月更文挑战第30天】本文介绍了Java多线程编程的基础,包括线程概念、创建线程(继承`Thread`或实现`Runnable`)、线程生命周期。还讨论了线程同步与锁(同步代码块、`ReentrantLock`)、线程间通信(等待/通知、并发集合)以及实战技巧,如使用线程池、线程安全设计模式和避免死锁。性能优化方面,建议减少锁粒度和使用非阻塞算法。理解这些概念和技术对于编写高效、可靠的多线程程序至关重要。
|
1天前
|
Java 调度 开发者
Java中的多线程编程:基础知识与实践
【4月更文挑战第30天】 在现代软件开发中,多线程编程是提高程序性能和响应能力的关键。Java作为一款广泛使用的编程语言,提供了丰富的多线程支持。本文将介绍Java多线程的基础概念、实现方法以及常见问题的解决策略。我们将从线程的创建和管理入手,逐步深入到同步机制、死锁避免以及高级并发工具类的应用。通过实例代码演示和理论分析,旨在帮助读者掌握Java多线程编程的核心技能,提升软件项目的并行处理能力。
|
1天前
|
Java
java多线程售票例子
java多线程售票例子
|
1天前
|
Java 程序员
Java中的多线程编程与性能优化
【4月更文挑战第30天】本文主要探讨了Java中的多线程编程以及如何通过多线程技术来提升程序的性能。首先,我们将介绍多线程的基本概念和原理,然后深入探讨Java中实现多线程的两种主要方式:继承Thread类和实现Runnable接口。接着,我们将讨论多线程中的同步问题,包括synchronized关键字和Lock锁。最后,我们将探讨如何通过线程池来管理和优化线程,以及如何避免常见的多线程问题。
|
1天前
|
Java API
【亮剑】Java的List,如何删除重复的元素,教你三个方法搞定!
【4月更文挑战第30天】本文介绍了三种Java中删除List重复元素的方法:1) 使用HashSet,借助其不允许重复值的特性;2) 利用Java 8 Stream API的distinct()方法;3) 对自定义对象重写equals()和hashCode()。每种方法都附带了代码示例,帮助理解和应用。
|
2天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】本文将深入探讨Java并发编程中的一个重要主题——线程池。我们将从线程池的基本概念入手,了解其工作原理和优势,然后详细介绍如何使用Java的Executor框架创建和管理线程池。最后,我们将讨论一些高级主题,如自定义线程工厂和拒绝策略。通过本文的学习,你将能够更好地理解和使用Java的线程池,提高你的并发编程能力。
|
2天前
|
存储 安全 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第30天】在Java开发中,并发编程是一个复杂而又关键的领域。它允许多个线程同时执行,从而提高程序性能和资源利用率。然而,并发编程也带来了许多挑战,如数据不一致、死锁和线程安全问题。本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化策略。我们将通过实例分析如何在保证线程安全的同时提高程序性能,为Java开发者提供实用的指导。
|
2天前
|
Java 程序员 开发者
深入理解Java并发编程:线程同步与锁机制
【4月更文挑战第30天】 在多线程的世界中,确保数据的一致性和线程间的有效通信是至关重要的。本文将深入探讨Java并发编程中的核心概念——线程同步与锁机制。我们将从基本的synchronized关键字开始,逐步过渡到更复杂的ReentrantLock类,并探讨它们如何帮助我们在多线程环境中保持数据完整性和避免常见的并发问题。文章还将通过示例代码,展示这些同步工具在实际开发中的应用,帮助读者构建对Java并发编程深层次的理解。