自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 【JAVA多线程05】共享模型之无锁

无锁的情况下,即使重试失败,线程始终在高速运行,没有停歇,而加了synchronized会让线程在没有锁的时候阻塞,发生上下文切换,上下文切换代价是挺高的。主线程仅仅只能判断共享变量的值前后有没有发生变化,但是变化过程中是否经历了变化又变化回来是没有感知的,如果需要感知这一变化,需要加一个版本号。但是在无锁的状态下,因为线程需要保持运行,需要额外CPU支持,虽然不会出现阻塞的情况,但是会分不到时间片,导致一样的上下文切换。CAS必须借助volatile才能读取到共享变量的最新值实现,比较并交换的效果。

2022-10-03 14:22:40 179 1

原创 【MYSQL调优03】SQL底层执行原理详解

如果此时一个root管理员修改系统用户表权限,这里是感知不到的 ,需要重新建立连接经过完连接器后,并不是马上经过词法分析器,而是在左边的查询缓存中查询是否有此次查询语句的结果,有的话就不用去找磁盘了(5.8以后的版本已经没有了)通过连接器来建立客户端和数据库的连接,用户输入密码以及发送host,连接器会查找系统用户表来决定是否让其使用数据库,如果通过的话连接器会开辟一道内存供这个连接的会话使用,同时将用户信息和权限缓存到内存里面。-》放进缓存之后有插入操作,就不应该走缓存了,走的是磁盘。

2022-09-28 16:00:55 415

原创 【JAVA多线程04】JMM共享模型之内存

每个指令都可以分为:取指令,指令译码,执行指令,内存访问,数据写回这5个阶段。现代cpu支持多级指令流水线,可以同时执行上述的五个阶段,这时cpu可以同时运行五条指令的不同阶段,相当于一条执行时间最长的复杂指令,本质上不能缩短单条指令的执行时间,但是它变相提高了指令的吞吐量。首先在字节码上分析,一个对象可以不用调用构造方法就赋值到变量,在上图代码中,如果一个线程只执行了赋值操作,但是对象没有调用构造方法,第二个线程突然判断是否为空,此时是不为空的,就返回一个兑现,这个时候这个对象就是没有完成初始化的对象。

2022-09-28 14:14:34 195

原创 【Mysql优化02】

插播:为什么要二级索引,因为一级索引包含了所有数据,占用内存会比较大,二级索引如果包含结果集,就走二级索引,如果不包含的话可能会有回表操作,效率会变低。ref:相比eq_ref,不使用唯一索引,而是使用普通索引或者唯一索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。index:扫描全索引就能拿到结果,一般是扫描某个二级索引,不是从根查找,是直接扫描二级索引的叶子节点。All:扫描全索引就能拿到结果,一般是扫描某个主键索引,不是从根查找,是直接扫描主键索引的叶子节点。

2022-09-26 21:28:59 193

原创 【JAVA多线程03】共享模型之管程

obj.wait()让进入object监视器的线程到waitSet等待obj.notify()在object上正在witSet等待的线程挑一个唤醒obj.notifyAll()让object上正在waitSet等待的线程全部唤醒以上方法都是Obejct对象的方法,必须获得此对象的锁,才能调用这几个方法。

2022-09-26 20:46:19 110

原创 【Mysql优化-01】深入理解Mysql索引底层数据结构与算法

mysql学习之路

2022-09-16 14:48:43 261

原创 【java多线程02】JAVA线程

JVM就会启动一个叫main的主线程,并为其分配栈内存,接下来就把线程交给任务调度器,cpu开始执行main线程,栈帧内存存有:局部变量表,返回地址,锁记录,操作数栈。如果interrupt打断的是park,标记不会被清除,线程继续执行,如果之后有park,且期间没有改变标记,则会让park失效。但是有一种特殊的线程叫做守护线程,只要其他非守护线程结束了,即使这个守护线程没有执行完,他也会强制结束。从操作系统层面上说线程的状态可以分为:初始状态,可运行状态,运行状态,阻塞状态和终止状态,状态转换图如下。

2022-09-14 17:08:20 104

原创 【JAVA多线程01】基本概念

举例:有两行代码,一行是读取文件(在前面),一行是打印日志,如果是同步的话就是顺序执行,要读取文件结束才能打印日志。如果读取文件开了个新线程,那么打印日志就可以不用等待读取文件完成,直接就可以提前打印。只有一个核心CPU,有多个线程执行指令,只能分时间片给多个线程,这就是并发。并发是同一时间应对多件事情的能力,并行是同一时间动手做多件事情的能力。那什么是并行呢,多个核心CPU执行不同线程的指令就是并行。需要多核cpu才能提高效率,单核仍然是轮流执行。进程是负责管理资源分配的,线程是执行指令。

2022-09-13 11:40:32 85

原创 【Spring底层学习01】

1.Bean的生命周期底层原理2.依赖注入3.初始化底层4.Aop5.推断构造方法6.spring事务底层原理。

2022-09-11 15:00:19 146

原创 【算法打卡06】KMP算法

KMP算法思想:KMP算法的关键是维护一个前后缀最长相同长度表,这个表的作用是子串一个一个字符对比大串的时候,有一个子串不符合大串了,就可以查看子串中前一个数(因为此时遍历到的字符与大串已经冲突了)的值,这值是代表着以这个数为尾部的后缀,跟头结点开头的前缀最多有几个相同的数,意味着前缀已经匹配上后缀了,就可以在前缀后一个元素和后缀后一个元开始重新匹配。next表的生成:需要有两个指针,在一开始i指向字符串头部,j指向第二个字符。每次遍历j指向下个字符,在遍历过程中首先找到与j指向字符相同的元素,j.

2022-05-02 17:34:18 148

原创 【算法打卡05】哈希表

题目:有效的字母异位词解题思路:此题可以不使用map,因为题目限制只会出现小写字母,所以我们创建一个26大小的int数组,然后每次对char做减操作:char-‘a’,以此为坐标增加此坐标对应的值。首先遍历一个字符串,记录每个字母的出现次数,再遍历另一个字母的对应的下标值是否大于0,是的话减1,直至字符串遍历完毕。此外,如果两个字符串长度不相等,那必然不是有效的字母异位。 public boolean isAnagram(String s, String t) { .

2022-04-30 20:08:43 99

原创 【算法打卡04】两两交换链表中的元素

题目:两两交换链表中的节点本题的解题思路就是找循环的规律。首先两两交换真的只是牵扯到两个结点吗?显然不是的,如图3,4交换,那么结点2的指针也会改变,同时结点3会指向原来4指向的结点,所以涉及到四个结点。根据上面分析,每次循环还要牵扯到两组的前一个结点,所以本题我们加入一个虚拟头结点保证循环的一致性。每次循环中有三个主要的指针,t1指向第一个结点,t2指向第二个结点,t3指向t1的前一个结点,如果是第一次则是指向虚拟头结点。在每次循环中,主要交换t1,t2的结点的位置,然后t3指向.

2022-04-25 16:19:31 1618

原创 【算法打卡03】移除链表元素

题目:移除链表元素解题思想:链表题做插入(特别含头部),删除结点操作使用头结点可以很好的保证循环的一致性,例如此题,如果没有头结点要删除第一个结点需要思考一个较为复杂的操作,但是如果加入了头结点,我们只需在每次遍历判断中间结点指向的下一个结点是否为空,不为空的话是否是需要删除的结点即可 public ListNode removeElements(ListNode head, int val) { ListNode head1 = new ListNode(..

2022-04-22 17:17:09 1120

原创 [JVM学习03]直接内存

直接内存常见于NIO操作,用于数据缓冲区 分配成本较高,但是读写性能高 不受JVM内存回收管理传统IO文件输入输出的情况图java读取文件需要切换至内核态,磁盘文件先读入系统缓存区,再读入java缓冲区使用Buffer之后的文件输出输入图使用了Buffer之后会开辟一个java内存和系统内存共享的内存直接内存-垃圾回收实际上直接内存的释放是通过底层jdk的Unsafe类实现的,不能参与垃圾回收但是使用ByteBuffer的话当ByteBuffer被垃圾回收...

2022-04-21 13:38:00 63

原创 [JVM学习02]串池

常量池StringTable如上图所示,局部变量s1存到astore_1,局部变量s2存到astore_2,3存到astore_3。当s1要用到“a”时会在stringtable中生成(如果此变量不存在)底层实现实际上是找出StringTable里面的值用StringBuilder进行拼接,然后生成新的字符串对象,保存在堆里面。但是如果是由常量加法组成如:"a"+"b",则会直接在常量池找"ab"。一旦涉及到new字符串对象,都是存储在堆中StringTable串池特性...

2022-04-21 12:27:59 182

原创 【算法打卡03】顺时针遍历矩阵

题目:螺旋矩阵 II使用任何矩阵的题(适用面更广):螺旋矩阵解题思路:用最朴素的思想解决此题。按顺时针遍历,使用四个指针,分别指向现在左右上下层,先遍历最上面的一行,从最左到最右,然后第一次就遍历完了,指向上层的指针往下一层,然后开始遍历最右层,从上指针遍历到下指针,此时右边遍历完一列了,右指针可以向左指针靠,下和左同理。那么循环结束的条件是什么呢?这里采用矩阵的总个数,每次遍历完一个就让记录下遍历完的数的总和,如果已经达到了矩阵的总个数就停止遍历。 public in.

2022-04-20 17:23:24 297

原创 【算法打卡03】长度最小的子数组

题目:长度最小的子数组解题思路:本题使用双指针法,一个左指针,一个右指针,每次遍历中移动右指针,当左指针和右指针之间的数的总和大于等于目标值,就开始移动左指针,每移动一次就比较两个指针之间的个数,如果比之前小就更新,直到两个指针之间的数的总和小于目标值。 public int minSubArrayLen(int target, int[] nums) { int small = 0; int big = 0; int m.

2022-04-20 10:43:41 43

原创 【算法打卡02】移除元素

题目:移除元素给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。此题有暴力解法和双指针法。一个时间复杂度是O(N^2),一个是O(N)双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。双指针思想是...

2022-04-19 10:35:46 62

原创 【JVM学习01】

什么是JVM?java virtual machine - java 程序的运行环境(java二进制字节码的运行环境)好处:一次编写,到处运行。屏蔽底层。 自动内存管理,垃圾回收功能。有什么了不起的?java出现得比那些有垃圾回收的语言早,但是竞争对手是c和c++。 数组下标越界,越界检查,有可能覆盖其它代码的内存。 多态比较有不同种类的JVMJVM学习路线三大块...

2022-04-18 17:37:46 113

原创 【算法打卡01】二分查找解决平方根问题

题目:有效的完全平方数给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。进阶:不要 使用任何内置的库函数,如sqrt 。class Solution { public boolean isPerfectSquare(int num) { if(num == 1){ return true; } if(num == 0){ ...

2022-04-17 16:47:02 177

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除