自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL 深入浅出系列05—优化特定类型的查询

两种非常不同的作用:它可以统计某个列值的数量,也可以统计行数。(不统计 NULL)。如果在 COUNT() 的括号中指定了列或者列的表达式,则统计的就是这个表达式有值的结果数。。当 MySQL 确认括号内的表达式值不可能为空时,实际上就是在统计行数。最简单的就是当我们使用COUNT(*) 的时候,这种情况下通配符*并不会像我们猜想的那样扩展成所有的列, 会忽略所有列直接统计所有的行数。MyISAM 的 COUNT() 函数快的前提条件是,因为此时无须实际地去计算表的行数。

2024-03-15 22:22:16 572

原创 MySQL 深入浅出系列04—高性能的索引策略

高性能索引策略

2024-03-15 21:16:47 1517

原创 MySQL 深入浅出系列03—索引的基础

索引(MySQL 中也叫做“键”)是存储引擎用于快速找到记录的一种数据结构。数据量越大,索引对性能影响越大。

2024-03-15 12:21:22 113

原创 MySQL 深入浅出系列02—范式和反范式

在范式化的数据库中,每个事实数据会出现并且只出现 一次。相反,在反范式化的数据库中,信息是冗余的, 可能会存储在多个地方。

2024-03-15 00:16:52 370

原创 MySQL 深入浅出系列01—MySQL 架构

MySQL 逻辑架构和存储引擎

2024-03-14 22:52:15 555

原创 JUC 进阶成神系列08—共享模型之无锁

线程保证volatile变量都是直接操作主存,即一个线程对volatile变量的修改,对另一个线程可见。如果没有,虽然不会进入阻塞,但由于没有分到时间片,仍然会进入可运行状态,还会导致上下文切换,因此CAS需要多核CPU才能发挥优势,才能不发生上下文切换。过程中将A改成B,再将B改成A,再将A改成C。无锁情况下,即使重试失败,线程始终在高速运行没有停歇,而synchronized会让线程在没有获得锁的时候,发生上下文切换进入阻塞。的思想:最乐观的估计,不怕别的线程来修改共享变量,就算改了也没关系,再重试。

2024-03-14 17:37:28 303

原创 JUC 进阶成神系列07—共享模型之内存

Clock Cycle Time(cpu 的时钟周期时间),等于主频的倒数,是 cpu 能识别的最小时间单位,比如 4G 主频的 cpu 的 Clock Cycle Time 就是 0.25ns,作为对比,我们墙上挂钟的 Cycle time 是 1s。例如,运行一条加法指令一般需要一个时钟周期时间。线程对volatile变量的写(写入主存中,读写操作都是以主存中去读),对接下来其他线程对该变量的读可见。线程start前对变量的写,对该线程开始后(线程还没启动写入的变量,在线程启动以后)对该变量的读可见。

2024-03-14 17:20:03 267

原创 JUC进阶成神系列06—线程安全之ReentrantLock

try 块写的是要保护的临界区的代码,finally 块是为了将来无论有没有出现异常都能正确释放对象的锁,释放锁就是调用 unlock 方法。默认的 synchronized 和 ReentrantLock 的 Lock 方法也好,它们都是不可打断的,这种情况别人持有锁,我需要获得锁,就需要一直等待下去。本意是为了解决饥饿问题,但没必要,后面讲源码再细讲。比如哲学家就餐问题,一人一只筷子的死锁问题,(先入先得,公平锁),释放筷子让别人拿到就能解决死锁。先入先得,用得少,影响性能,其他方法一般都是非公平的。

2024-03-14 16:47:03 228

原创 JUC 进阶成神系列05—线程安全之 Park&Unpark

Park&Unpack 是以线程为单位来阻塞和唤醒线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么精确。检查_conter,本情况为 1,这时线程无需阻塞,继续运行,设置_counter 为 0。唤醒_cond 条件变量中的 Thread_0,线程恢复运行,运行之后又把干粮吃掉,设置_counter 为 0。线程:旅人,Parker:背包,条件变量:背包中的帐篷,_counter:背包中的备用干粮(0为耗尽,1为充足)备用干粮充足,不需停留,继续前进。

2024-03-14 16:21:58 222

原创 JUC进阶成神系列04—线程安全之 wait notify

obj.wait()让进入 object 监视器的线程到 waitSet 等待。**wait()**方法会释放对象的锁,进入 WaitSet 等待区,从而让其他线程就机会获取对象的锁。

2024-03-14 16:10:07 371

原创 JUC 进阶成神系列03—线程安全之 synchronized

这里的线程安全指的是,多个线程调用它们同一个实例的某个方法时,是线程安全的。加锁与不加锁得分相近的原因:JIT即时编译器会对字节码进行进一步优化,对java代码是用解释的方法执行,但是对热点代码反复调用的方法会进行优化,手段是分析看局部变量是不是能优化,根本不可能逃离方法作用范围,不可能被共享,synchronized 解决方案即俗称的对象锁,采用互斥的方式让同一时刻最多只有一个线程能持有对象锁,其他线程再想获取这个对象锁就会阻塞,保证拥有锁的线程可以安全执行临界区代码,不用担心上下文切换。

2024-03-14 15:55:17 225

原创 JUC 进阶成神系列02—Java 与线程

狭义上的用户线程指的是完全建立在用户空间的线程库上,系统内核不能感知到用户线程的存在及如何实现的。HotSpot:它的每一个Java线程都是直接映射到一个操作系统原生线程来实现的,而且中间没有额外的间接结构,所以HotSpot自己是不会去干涉线程调度的(可以设置线程优先级给操作系统提供调度建议),全权交给底下的操作系统去处理,所以何时冻结或唤醒线程、该给线程分配多少处理器执行时间、该把线程安排给哪个处理器核心去执行等,都是由操作系统完成的,也都是由操作系统全权决定的。

2024-03-14 15:07:12 409

原创 JUC 进阶成神系列01—进程与线程

并发:单核CPU下,线程CPU串行执行,任务调度室将CPU时间片-最小15毫秒,切换非常快,肉眼察觉不到,“微观串行,宏观并行”,线程轮流使用CPU。线程通信简单,更轻量级,线程上下文切换比进程切换比底本低。程序由指令和数据组成,指令需要运行就要加载到CPU,数据需要读写就要加载到内存,进程就是加载指令、管理内存、管理IO的。进程有共享资源,供内部线程共享。线程共享进程内的内容,比如多个线程可以访问同一个共享变量。并行:多核CPU下,每个核都可以调度运行线程。线程存在于进程中,是进程的子集。

2024-03-14 14:29:22 135

原创 JVM 夯实基础系列05—经典垃圾收集器详解

相比起来CMS的卡表就相当简单, 只有唯一一份,而且只需要处理老年代到新生代的引用,反过来则不需要,由于新生代的对象具有朝生夕灭的不稳定性,引用变化频繁,能省下这个区域的维护开销是很划算的。浮动垃圾:在CMS的并发标记和并发清理阶段,用户线程是还在继续运行的,程序在运行自然就还会伴随有新的垃圾对象不断产生,但这一部分 垃圾对象是出现在标记过程结束以后,CMS无法在当次收集中处理掉它们,只好留待下一次垃圾收集时再清理掉。G1是一个面向全堆的收集器,不再需要其他新生代收集器的配合工作。

2024-03-13 16:02:20 284

原创 JVM 夯实基础系列04—栈帧和方法调用

“栈帧”(Stack Frame)则是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用开始至执行结束的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。

2024-03-12 22:23:10 1491

原创 JVM 夯实基础系列03—类加载机制

Java 虚拟机把描述类的数据从 Class 文件中加载到内存,并对数据进行检验、转换解析和初始化,最终变成可以被虚拟机直接使用的 Java 类型的过程叫虚拟机类加载机制。

2024-03-12 14:47:49 627

原创 JVM 夯实基础系列02—垃圾收集算法

垃圾收集需要完成的三件事:哪些内存需要回收?什么时候回收?如何回收?

2024-03-11 22:55:36 1310 1

原创 JVM 夯实基础系列01—内存区域解析

Java 虚拟机所管理的内存运行时包括的数据区

2024-03-11 21:18:36 482

空空如也

空空如也

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

TA关注的人

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