![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java基础
文章平均质量分 77
淡墨@~无痕
这个作者很懒,什么都没留下…
展开
-
JUC并发编程系列详解篇十七(happens-before原则)
happens-before是JMM最核心的概念。对应Java程序员来说,理解happens-before是理解JMM的关键。原创 2022-09-12 23:55:44 · 354 阅读 · 1 评论 -
JUC并发编程系列详解篇十六(java中的其他锁)
无锁,偏向锁,轻量级锁,重量级锁,这四种锁是指锁的状态,专门针对synchronized的。偏向锁通过对比Mark Word解决加锁问题,避免执行CAS操作。而轻量级锁是通过用CAS操作和自旋来解决加锁问题,避免线程阻塞和唤醒而影响性能。重量级锁是将除了拥有锁的线程以外的线程都阻塞。原创 2022-09-12 16:17:34 · 267 阅读 · 0 评论 -
JUC并发编程系列详解篇十五(公平锁VS非公平锁)
ReentrantLock 是一把可重入锁,也是一把互斥锁,它具有与 synchronized 相同的方法和监视器锁的语义,但是它比 synchronized 有更多可扩展的功能。ReentrantLock 的可重入性是指它可以由上次成功锁定但还未解锁的线程拥有。当只有一个线程尝试加锁时,该线程调用 lock() 方法会立刻返回成功并直接获取锁。如果当前线程已经拥有这把锁,这个方法会立刻返回。可以使用 isHeldByCurrentThread 和 getHoldCount 进行检查。原创 2022-09-12 15:56:45 · 333 阅读 · 0 评论 -
JUC并发编程系列详解篇十四(自旋锁 VS 适应性自旋锁)
自旋锁 VS 适应性自旋锁 ,当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。这种采用循环加锁 -> 等待的机制被称为自旋锁(spinlock)。原创 2022-09-12 01:41:08 · 278 阅读 · 0 评论 -
JUC并发编程系列详解篇十三(悲观锁VS乐观锁)
在java并发编程中,锁有很多种类,如下图所示:悲观锁乐观锁自旋锁适应性自旋锁无锁偏向锁轻量级锁重量级锁公平锁非公平锁可重入锁不可重入锁共享锁排他锁。原创 2022-09-11 23:57:48 · 298 阅读 · 0 评论 -
JUC并发编程系列详解篇十二(synchronized底层原理进阶)
之后的程序睡眠5秒钟后,程序中t1、t2线程执行代码块时,有意的将其线程睡眠几秒钟,目的在于不管那个线程率先抢到锁,都能让另外一个线程在自旋等待中,所以t1线程打印的是“00”就已经是轻量级锁了,最后看程序执行结果,t2打印的是“10”就已经升级为重量级锁了,显然t2线程已经超过了自旋的最大次数,已经转成重量级锁了。接着线程t1打印了object对象头,可以与第一个打印出来的对象头对比不难发现t1打印的也是偏向锁,但是t1打印的对象头已经把t1的线程id记录在了其对应的23位;原创 2022-09-11 20:04:11 · 574 阅读 · 0 评论 -
JUC并发编程系列详解篇十一(synchronized底层的锁)
操作系统分为“用户空间”和“内核空间”,JVM是运行在“用户态”的,jdk1.6之前,在使用synchronized锁时需要调用底层的操作系统实现,其底层monitor会阻塞和唤醒线程,线程的阻塞和唤醒需要CPU从“用户态”转为“内核态”,频繁的阻塞和唤醒对CPU来说是一件负担很重的工作,这些操作给系统的并发性能 带来了很大的压力。同这个时候CPU就需要从“用户态”切向“内核态”,在这个过程中就非常损耗性能而且效率非常低,所以说jdk1.6之前的synchronized是重量级锁。原创 2022-09-11 01:25:59 · 442 阅读 · 0 评论 -
JUC并发编程系列详解篇十(Synchronized底层原理分析)
synchronized 锁机制在 Java 虚拟机中的同步是基于进入和退出监视器锁对象 monitor 实现的(无论是显示同步还是隐式同步都是如此),每个对象的对象头都关联着一个 monitor 对象,当一个 monitor 被某个线程持有后,它便处于锁定状态。原创 2022-09-11 00:30:16 · 306 阅读 · 0 评论 -
JUC并发编程系列详解篇九(synchronized基础)
在JVM中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。对象头又包括两部分信息,第一部分用于存储对象自身的运行时数据(Mark Word),如HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。对象头的另外一部分是类型指针(Klass pointer),即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。原创 2022-09-10 23:16:14 · 503 阅读 · 0 评论 -
JUC并发编程系列详解篇六(死锁的基本概念)
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,这就需要引入安全序列来进行判断资源分配是否合理。安全序列是指一个进程序列比如从P1到Pn是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。原创 2022-09-10 14:56:00 · 215 阅读 · 0 评论 -
JUC并发编程系列详解篇五(线程基础理论进阶)
什么是线程安全?当多线程运行了同一代码的时候,如果产生了不同的结果会怎么样?就好比如家里养的鸡下的蛋结果却孵出来一个老鹰,这怎么也显得不合适了,所以线程安全说白了就一句话,当多线程运行同一代码,不会产生不一样的结果。即代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。在多线程环境中,当各线程不共享数据的时候,即都是私有(private)成员,那么一定是线程安全的。原创 2022-09-10 14:52:36 · 159 阅读 · 0 评论 -
JUC并发编程系列详解篇四(线程基础理论)
这其实是很有意义的,首先多线程的运行和单线程运行相比有很多复杂困难的问题,因为多线程运行充满了未知性,比如说某条线程是否运行,运行了多少时间,线程所期望的数据是否已经赋值完毕,Callable接口的泛型的Future/FutureTask却可以获取多线程运行的结果,可以在等待时间太长没获取到需要的数据的情况下取消该线程的任务。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。创建一个单线程的线程池。原创 2022-09-10 14:36:06 · 180 阅读 · 0 评论 -
JUC并发编程系列详解篇三(三大根源性问题)
对于如今的多核处理器,每颗CPU都有自己的缓存,缓存读取的速度非常快,但是缓存仅仅对它所在的处理器可见,CPU缓存与内存的数据不容易保证一致。因此为了避免处理器停顿下来等待向内存写入数据而产生的延迟,处理器使用写缓冲区来临时保存向内存写入的数据。写缓冲区合并对同一内存地址的多次写,并以批处理的方式刷新,也就是说写缓冲区不会即时将数据刷新到主内存中。这个时候缓存不能及时刷新向内存中写入数据,这就导致了可见性问题。原创 2022-09-10 14:05:13 · 113 阅读 · 0 评论 -
JUC并发编程系列详解篇二(并发编程挑战篇)
资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。举例说明:例如,服务器的带宽只有2Mb/s,某个资源的下载速度是1Mb/s每秒,系统启动10个线程下载资源,下载速度不会变成10Mb/s,所以在进行并发编程时,要考虑这些资源的限制。硬件资源限制有带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。软件资源限制有数据库的连接数和socket连接数等。原创 2022-09-10 13:48:07 · 132 阅读 · 0 评论 -
JUC并发编程系列详解篇一(基础)
同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”地执行。整个过程,不会阻碍调用者的工作。如图所示:图中显示了同步方法调用和异步方法调用的区别。对于调用者来说,异步调用似乎是一瞬间就完成的。如果异步调用需要返回结果,那么当这个异步调用真实完成时,则会通知调用者。原创 2022-09-10 01:36:39 · 666 阅读 · 0 评论 -
java泛型机制详解篇二(深入理解泛型篇一)
当类定义中的类型参数没有任何限制时,在类型擦除中直接被替换为Object,即形如和的类型参数都被替换为Object。原创 2022-08-23 17:25:36 · 143 阅读 · 0 评论 -
java反射机制详解篇一(基础)
当程序执行到new ObjectClass的时候,java虚拟机会加载ObjectClass.class文件,这个文件是由ObjectClass.java生成的,当java虚拟机将ObjectClass.class加载进内存后,内存中会存在一个class对象,这就是一个类加载变成对象的大致过程,具体详细过程可以参考一下。知道了这些,那什么才是反射呢?原创 2022-08-22 18:40:54 · 81 阅读 · 0 评论 -
java虚拟机详解篇一(基础)
Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释编译为对应平台上的机器指令执行每一条java指令。java虚拟机规范中都有详细的定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。其在代码运行的过程中居最重要的地位。.........原创 2022-08-16 16:10:20 · 989 阅读 · 0 评论 -
java的泛型机制详解篇一(基础知识点)
泛型的本质是为了`参数化类型`(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为`泛型类`、`泛型接口`、`泛型方法`。......原创 2022-08-15 23:02:35 · 215 阅读 · 0 评论 -
java基础知识点总结篇一
1、什么是面向对象?网上资料: 面向对象是一种基于面向过程的编程思想,是向现实世界模型的自然延伸,这是一种“万物皆对象”的编程思想。由执行者变为指挥者,在现实⽣生活中的任何物体都可以归一类事物,而一个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动。我的回答: ,比如说一个学生,当创建一个学生的对象,那就需要学生的就读学校,就读班级,定位学生的学号,学生的学习成绩,学生的授课老师,这些属性综合起来就可以描述一个学生的群体,这就是一个对象,反正总的一句话,。2、Java语言有哪些特点?答原创 2022-08-08 17:26:24 · 379 阅读 · 0 评论 -
java11中String类,StringBuffer类和StringBuilder类区别
.它实现了Serializable, Comparable, CharSequence接口,类被final关键字修饰,所以类不能不能被继承,并且是线程安全的。原创 2022-08-05 14:07:42 · 263 阅读 · 0 评论 -
Netty学习日记一:三大组件
channel 有一点类似于 stream,它就是读写数据的,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层fill:#333;color:#333;color:#333;fill:none;...原创 2022-08-04 23:40:37 · 82 阅读 · 0 评论 -
java常用设计模式及设计原则详解二(七大设计原则篇)
编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有更好。原创 2022-08-04 17:09:46 · 152 阅读 · 0 评论 -
LeetCode刷题日记:899. 有序队列
给定一个字符串 s 和一个整数 k。你可以从 s 的前 k 个字母中选择一个,并把它加到字符串的末尾。返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串。原创 2022-08-04 00:02:44 · 241 阅读 · 0 评论 -
LeetCode刷题日记:全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列。你可以 按任意顺序 返回答案。给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有。原创 2022-08-03 16:42:34 · 116 阅读 · 0 评论 -
LeetCode刷题日记:135. 分发糖果
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目。总的来说是先从左边遍历到右边,期间判断右边比左边大,然后相应赋值,再从右边遍历到左边,再赋值。......原创 2022-08-03 15:55:12 · 252 阅读 · 0 评论 -
LeetCode刷题日记:1545. 找出第 N 个二进制字符串中的第 K 位
给你两个正整数 n 和 k,二进制字符串 Sn 的形成规则如下:S1 = “0”当 i > 1 时,Si = Si-1 + “1” + reverse(invert(Si-1))其中 + 表示串联操作,reverse(x) 返回反转 x 后得到的字符串,而 invert(x) 则会翻转 x 中的每一位(0 变为 1,而 1 变为 0)。示例 3:输入:n = 1, k = 1输出:“0”思路:其实没啥好说的,看懂规律即可。...原创 2022-08-03 15:30:33 · 147 阅读 · 0 评论 -
LeetCode刷题日记:153、寻找旋转排序数组中的最小值
已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到若旋转4次,则可以得到[4,5,6,7,0,1,2]若旋转7次,则可以得到[0,1,2,4,5,6,7]注意,数组[a[0],a[1],a[2],…,a[n-1]]旋转一次的结果为数组[a[n-1],a[0],a[1],a[2],…,a[n-2]]。...原创 2022-08-02 00:45:06 · 82 阅读 · 0 评论 -
LeetCode刷题日记:LCP 03.机器人大冒险
力扣团队买了一个可编程机器人,机器人初始位置在原点(0,0)。小伙伴事先给机器人输入一串指令command,机器人就会无限循环这条指令的步骤进行移动。指令有两种U向y轴正方向移动一格R向x轴正方向移动一格。不幸的是,在xy平面上还有一些障碍物,他们的坐标用obstacles表示。机器人一旦碰到障碍物就会被损毁。给定终点坐标(x,y),返回机器人能否完好地到达终点。如果能,返回true;否则返回false。...原创 2022-08-02 00:23:50 · 251 阅读 · 0 评论 -
LeetCode刷题日记:53、最大子数组和
给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。解释连续子数组[4,-1,2,1]的和最大,为6。进阶如果你已经实现复杂度为O(n)的解法,尝试使用更为精妙的分治法求解。...原创 2022-08-01 23:01:31 · 123 阅读 · 0 评论 -
LeetCode刷题日记:搜索二维矩阵(一和二)
编写一个高效的算法来判断mxn矩阵中,是否存在一个目标值。该矩阵具有如下特性每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。原创 2022-08-01 22:37:43 · 119 阅读 · 0 评论 -
LeetCode刷题日记: 33、搜索旋转排序数组
整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0原创 2022-08-01 22:08:03 · 83 阅读 · 0 评论 -
LeetCode刷题日记:34、 在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你必须设计并实现时间复杂度为O(logn)的算法解决此问题。......原创 2022-08-01 21:34:26 · 75 阅读 · 0 评论 -
LeetCode刷题日记:215. 数组中的第K个最大元素
数组中的第K个最大元素给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。提示:1原创 2022-07-09 15:14:52 · 123 阅读 · 0 评论 -
LeetCode刷题日记:3.无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。提示:0原创 2022-07-09 15:02:20 · 94 阅读 · 0 评论 -
常用的排序算法(java版)
排序算法1、冒泡排序主要流程重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。基本算法原理1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3、针对所有的元素重复以上的步骤,除了最后一个。4、持续每次对越来越少的元素重复上面的步骤,直到没有原创 2022-07-09 14:59:23 · 872 阅读 · 0 评论 -
java常见粗误知识总结篇一(数组转换问题)
java集合知识查漏补缺篇一(Arrays篇)原创 2022-05-01 22:15:09 · 457 阅读 · 0 评论 -
java面经总结篇一(JVM篇)
JVM 的主要组成部分JVM的主要组成部分有以下几种:类加载器(ClassLoader)运行时数据区(Runtime Data Area)执行引擎(Execution Engine)本地库接口(Native Interface)首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Exe原创 2022-04-23 23:59:57 · 295 阅读 · 0 评论 -
java核心知识体系之基础总结篇五(值传递)
值传递原创 2022-04-23 16:39:13 · 299 阅读 · 0 评论 -
LeetCode刷题日记 - 15. 三数之和
15. 三数之和原创 2022-04-22 00:09:40 · 255 阅读 · 0 评论