
Java
文章平均质量分 89
梳理Java基础, JVM, 线程,进程,多线程,线程池技术理解
搬砖界的小白
凡所迹遇,绝非偶然
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【并发】第九篇 Atomic原子操作类 - 字段更新器类详解
Atomic的字段更新器类是Java中一种用于实现线程安全的字段更新操作的类。它提供了一组原子操作,可以对字段进行原子性的更新。在并发环境中,多个线程同时更新一个字段可能会出现竞态条件(Race Condition)导致数据不一致的问题。Atomic的字段更新器类基于CAS(Compare And Swap)操作机制来保证对字段的原子操作,避免了竞态条件的发生。Atomic的字段更新器类的常用实现包括(原子更新整型的字段的更新器)、(原子更新长整型字段的更新器)、(原子更新引用类型里的字段)等。原创 2024-04-17 18:03:06 · 702 阅读 · 0 评论 -
【并发】第八篇 Atomic原子操作类 - 引用类型类详解
Atomic原子操作类是Java中提供的一组线程安全的基本数据类型操作类,可用于实现线程安全的并发编程。它们可以确保在并发环境下对变量进行原子操作,即不会被其他线程中断或同时修改。原子更新基本类型的 AtomicInteger,只能更新一个变量, 如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类,包括。注: 源码版本是基于JDK1.8 版本。原创 2024-04-17 16:33:43 · 1127 阅读 · 0 评论 -
【并发】第七篇 Atomic原子操作类 - 数组类型类详解
Atomic原子操作类是Java中提供的一组线程安全的基本数据类型操作类,可用于实现线程安全的并发编程。它们可以确保在并发环境下对变量进行原子操作,即不会被其他线程中断或同时修改。原创 2024-04-16 14:55:11 · 771 阅读 · 0 评论 -
【并发】第六篇 Atomic原子操作类 - 基本类型类详解
Atomic原子操作类是Java中提供的一组线程安全的基本数据类型操作类,可用于实现线程安全的并发编程。它们可以确保在并发环境下对变量进行原子操作,即不会被其他线程中断或同时修改。常用的基本类型类有AtomicLong和。原创 2024-04-15 16:39:03 · 1052 阅读 · 0 评论 -
【并发】 第五篇 原子操作(二) - CAS 详解
CAS是"比较并交换"(Compare and Swap)的缩写。是一种并发控制机制,用于实现多个线程同时对同一数据进行原子操作(读取、写入、更新),并且能够保证操作的一致性。# 1.比较:通过比较当前值和期望值是否一致来判断是否修改成功# 2.交换:如果一致则修改,否则重新尝试。CAS的一种常见应用是实现乐观锁。在乐观锁机制中,线程在更新共享变量之前先检查该变量是否被其他线程修改过,如果没有修改则更新,否则重新尝试。CAS操作正是基于这个原理来实现的。原创 2024-04-12 14:49:49 · 987 阅读 · 0 评论 -
【并发】 第四篇 原子操作
此时,如果有其他线程也执行对该共享变量的值进行修改操作, 那么上述的三个步骤,就会受到其他线程的干扰,最终内存中的共享变量值可能就不是期望的结果。这是因为每个线程最开始从内存中获取的值, 有可能被其他线程修改了, 线程之间的数据是不同步的, 导致线程最后写入的值会被其他线程覆盖。上述的例子中,线程的操作会受到其他线程的干扰, 并非原子操作, 而使用原子操作即可解决上述现象。原子操作是指不能被中断的一组操作,要么全部执行成功,要么全部不执行,不会出现部分执行的情况。将上面的例子代码优化下,原创 2024-04-12 10:48:38 · 481 阅读 · 0 评论 -
【算法】第二篇 大衍数列
大衍数列,来源于《乾坤谱》中对易传“大衍之数五十”的推论。主要用于解释中国传统文化中的太极衍生原理。数列中的每一项,都代表太极衍生过程中,曾经经历过的两仪数量总和。是中华传统文化中隐藏着的世界数学史上第一道数列题。前10项为: 0、2、4、8、12、18、24、32、40、50……原创 2024-04-08 15:43:38 · 597 阅读 · 0 评论 -
【算法】第一篇 外观数列
外观数列是指数列中的每一项都是描述前一项的外观或者外貌。它通常由初始项开始,通过描述前一项的外观来生成下一项。原创 2024-03-29 15:55:47 · 537 阅读 · 0 评论 -
【并发】第三篇 Hash冲突的解决方法
哈希(hash)是将任意长度的输入数据转化为固定长度的输出数据的算法。哈希函数会将输入数据压缩并映射为一个固定长度的哈希值,通常用一个字符串或数字来表示。哈希冲突是指两个不同的输入值在经过哈希函数计算后得到了相同的哈希值。由于哈希函数的输出长度是固定的,而输入的数据可能有无限多的可能性,所以哈希冲突是不可避免的。哈希冲突会引起一些问题,例如当使用哈希表进行数据存储时,如果有两个不同的键经过哈希函数计算得到了相同的哈希值,就会导致数据冲突,可能会导致数据丢失或覆盖。原创 2024-03-27 17:47:53 · 915 阅读 · 0 评论 -
【并发】第二篇 ThreadLocal详解
ThreadLocal 是 Java 中的一个类,它提供了线程局部变量的机制。线程局部变量是指每个线程都有自己独立的变量副本,线程之间互不影响。通常情况下,如果多个线程同时访问一个共享变量,需要进行同步来保证线程安全,如Synchronized。而使用 ThreadLocal 也可以避免线程安全问题,因为每个线程都拥有自己的变量副本,且可以独立地操作自己的变量副本,而不会影响其他线程的副本。线程之间的变量副本互不干扰,保证了线程安全。原创 2024-03-27 11:05:09 · 1073 阅读 · 0 评论 -
【并发】第一篇 引用类型详细介绍
Java中有四种引用类型,它们分别是强引用(Strong Reference),软引用(Soft Reference),弱引用(Weak Reference)和虚引用(Phantom Reference)。每种引用类型在Java垃圾回收过程中的行为和使用场景略有不同。原创 2024-03-21 00:03:23 · 989 阅读 · 0 评论 -
【JVM】第五篇 垃圾收集器G1和ZGC详解
ZGC收集器能仅从引用上就明确得知一个对象是否处于重分配集之中,如果用户线程此时并发访问了位于重分配集中的对象,这次访问将会被预置的内存屏障(读屏障)所截获,然后立即根据Region上的转发表记录将访问转发到新复制的对象上,并同时修正更新该引用的值,使其直接指向新对象,ZGC将这种行为称为指针的“自愈”Self-Healing)能力。统一存储器存储结构,表示内存只有一块,所有的CPU都去访问这一块内存,会存在内存竞争,有竞争就会有锁的问题,有锁就会影响执行的效率,并且CPU核心数越多,竞争就会越激烈。原创 2023-09-27 17:19:46 · 1058 阅读 · 0 评论 -
【JVM】第四篇 垃圾收集器ParNew&CMS底层三色标记算法详解
当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。的特点特出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。优缺点: 效率高,但是只能使用在年轻代,不能使用在老年代中,老年代中大多数的对象都是存活的,没有多余的担保空间来将内存一分为二。如老年代中对象的存活几率是非常高的,而且没有额外的空间进行分配担保,所以选择“标记-清除”或“标记-整理”算法进行垃圾收集。原创 2023-09-27 14:29:06 · 967 阅读 · 0 评论 -
【JVM】第三篇 JVM对象创建与内存分配机制深度剖析
大量的对象被分配在Eden区,Eden区满了后会触发Minor GC,可能会有99%以上的对象成为垃圾被回收掉,剩余存活的对象会被挪到S0区,下一次Eden区满了后又会触发Minor GC,把Eden区和survivor区垃圾对象回收,把剩余存活的对象一次性挪动到S1区,因为新生代的对象都是朝生夕死的,存活时间很短,所以JVM默认的8:1:1的比例是很合适的,让Eden区尽量的大,Survivor区够用即可。JVM内存布局规定了Java在运行过程中的内存申请、分配、管理的策略,保证了JVM高效的运行。原创 2023-09-26 01:39:03 · 1072 阅读 · 0 评论 -
【JVM】第二篇 JVM内存模型深度剖析与优化
按照线程是否共享来划分TLAB线程本地分配缓存区,这是一个线程专用的内存分配区域由于对象一般会分配在堆上,而堆是全局共享的。因此在同一时间,可能会有多个线程在堆上申请空间。因此,每次对象分配都必须要进行同步,在竞争激烈的场合分配的效率又会进一步下降, JVM使用TLAB来避免多线程冲突,在给对象分配内存时,每个线程使用自己的TLAB,这样可以避免线程同步,提高了对象分配的效率JVM内存模型清晰版(结合代码分步解析)int a = 1;int b = 2;return c;原创 2023-09-24 23:03:32 · 736 阅读 · 0 评论 -
【面试篇】集合相关高频面试题
从上面的例子发现, 虽然HashCode的倒数第二第三位从0变成了1,但是运算的结果都是1001。因为HashMap的设计者认为后插入的元素, 被访问到的概率最大, 所以HashMap在使用链表解决hash冲突的元素时,采用了头插法, 这样每次访问链表时, 先判断头节点是否等于目标节点, 如果是,直接返回目标节点, 不需要再去遍历整个链表了, 提升了查询效率。来计算hash值, 将初始容量设置为16,能最大程度的将元素散列的分布在数组上, 且最大程度的减少hash冲突的产生, 符合Hash算法。原创 2023-09-20 01:31:13 · 344 阅读 · 0 评论 -
【Map篇】HashTable详解
快速查找:Hashtable中的键值对是通过哈希函数计算索引值得到的,因此可以快速地查找元素,时间复杂度为 O(1)。高效插入和删除:由于哈希表的键值对是通过哈希函数计算索引值得到的,所以在插入或删除元素时,只需要计算一次哈希值即可定位元素,因此插入和删除操作都非常快速,时间复杂度为 O(1)。空间利用率高:哈希表只需要存储键和值,不需要额外的空间来存储指向下一个元素的指针,因此空间利用率比较高。可扩展性。原创 2023-09-20 01:07:13 · 247 阅读 · 0 评论 -
【Map篇】HashMap详解
在 Java 中的 HashMap 是基于哈希表实现的,哈希表的核心是数组,而数组的大小是固定的。当我们往 HashMap 中添加元素时,如果当前位置已经有元素了,则会发生碰撞,这个时候 HashMap 会依据一定的规则将元素添加到数组的其他位置。如果想要提高 HashMap 的性能,就需要尽可能减少碰撞。一种有效的方式就是通过调整数组的大小,增加数组的容量,从而使得元素分布更加均匀,减少碰撞的发生。而为了在扩容后保持哈希表中原有元素的位置不变,HashMap 采用了重新哈希的方法来处理。原创 2023-09-19 18:10:38 · 374 阅读 · 0 评论 -
【List篇】第四篇 LinkedList 详解
Java中的LinkedList是一种实现了List接口的双向链表数据结构。链表是由一系列节点(Node)组成的,每个节点包含了指向数据item和。Deque两端链表指针的指向O(1)从头开始遍历链表O(n)Cloneable克隆Iterablefor-eachList增删改查。原创 2023-09-17 23:56:18 · 527 阅读 · 0 评论 -
【List篇】第三篇 ArrayList 的线程不安全介绍
ArrayList 不是线程安全的原创 2023-09-10 23:21:45 · 1293 阅读 · 0 评论 -
【List篇】第二篇 ArrayList 详解(含图示说明)
Java中的ArrayList是一个动态数组,可以自动扩展容量以适应数据的添加和删除。它可以用来存储各种类型的数据,例如String,Integer,Boolean等。ArrayList实现了List接口,可以进行常见的List操作,例如添加、插入、删除和访问元素等。原创 2023-09-08 02:46:07 · 537 阅读 · 0 评论 -
【List篇】第一篇 使用Arrays.asList生成的List集合,操作add方法报错
主要是记录一次日常开发中,使用Arrays.asList方法创建list,然后使用add出现异常的场景原创 2023-09-01 17:00:41 · 3208 阅读 · 0 评论 -
【JVM】第一篇 从JDK源码级别彻底剖析JVM类加载机制
一. Java类加载运行全过程二. 从JDK源码级别剖析JVM核心类加载器三. 从JDK源码级别剖析类加载双亲委派机制四. 手写自定义类加载器打破双亲委派机制五. Tomcat类加载机制深度剖析六. 手写Tomcat类加载器实现多版本代码共存隔离原创 2021-11-18 09:50:59 · 1038 阅读 · 0 评论 -
《Java》第二篇 创建线程的方式和生命周期
一.线程与进程的区别二.Java中创建线程的集中方式三.线程的生命周期四.多线程与多进程五.线程池的使用原理以及在项目中的使用场景六.进程的分类七.线程同步八.线程中的死锁原创 2020-04-02 10:40:17 · 271 阅读 · 0 评论 -
《Java》第一篇 进程与线程的区别
基本概念进程:我们都知道计算机的核心是CPU,它承担了所有的计算任务,而操作系统是计算机的管理者,它负责任务的调度,资源的分配和管理统领整个计算机硬件;应用程序是具有某种功能的程序,程序是运行于操作系统之上的。进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程序,数据集合和进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程原创 2020-03-27 17:57:27 · 187 阅读 · 0 评论